继承Thread类实现多线程简单实例
继承Thread类实现多线程简单实例
文章目录
- 继承Thread类实现多线程简单实例
- 一、多线程的意义
- 二、多线程的创建
- 三、代码
一、多线程的意义
1.为什么要使用多线程
(a)提高用户体验或者避免ANR
在事件待处理码中需要使用多线程,否则会出现ANR(Application is not responding),或者因为响应时间太慢导致用户体验很差。
(b)异步
应用中有些情况并不一定需要同步阻塞去等待返回结果,可以通过多线程实现异步,例如你的应用中的某个Activity需要从云端获取一些图片,加载图片比较耗时,这时就需要异步加载,加载完成一个图片刷新一个。
(c)多任务
多线程下载
2.为什么通过多线程可以提高用户体验,避免ANR
(a)深入了解
Android应用程序的main线程,它负责处理UI的绘制,Android系统为了防止应用程序反应较慢导致无法正常运行做了一个处理,一种情况是当用户输入事件5秒内无法得到相应,那么系统会弹出ANR对话框,由用户决定继续等待还是强制结束应用程序,另一种情况就是BroadcastReciever超过10s没执行完也会弹出。
即使你的程序中的某个事件响应不超过5分钟,人眼可辨别的时间是0.1秒,小于0.1秒基础感觉不出来,超过0.2秒用户就觉得有点卡了,俗称“打嗝”现象,用户体验会很差。
比如有些应用,它要显示很多图片,所以它是异步的,可以在图片加载成功之前显示一个默认的图片,加载成功后刷新一下即可。
(b)事件处理的原则
①所有耗时的操作都放到其他线程去处理。
②Android中的Main线程的事件处理不能太耗时,否则后续事件无法在5秒内得到回应,就会弹出ANR对话框。
(c)Main线程
①Activity的生命周期的方法
②通常on开头的方法是在Main线程中回调的
③onStart()、onCreate()、onResume()执行时间决定了首页的打开时间。
④可以使用SplashScreen,用动态的,让用户知道你的应用没死掉。
3.如何实现多线程之间的通讯
(a)Handler
(b)AsyncTask
二、多线程的创建
1.继承Thread类实现多线程
Thread本质上也是实现了Runnable接口的一个实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start()实例方法。
start()方法是一个native方法,他将启动一个新线程,并执行run()方法,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己的run()方法。
2.实现Runable接口方式实现多线程
如果自己的类已经extends另一个类,就无法直接extends Thread,此时必须实现一个Runnable接口。
同时为了启动MyThread,需要首先实例化一个Thread,并传入自己的已经实现好Runnable接口的目标对象。
3.实现Runable和实现Thread的区别
(a)一个类只能继承一个父类,存在局限;一个类可以实现多个接口
(b)在实现Runnable接口的时候调用Thread(Runnable target)创建进程时,使用同一个Runnable实例,则建立的多线程的实例变量也是共享的。但是通过继承Thread类是不能用一个实例建立多个线程,故而实现Runnable接口适用于资源共享。当然,继承Thread类也能够共享变量,能共享Thread类的static变量
(c)Runnable接口和Thread之间的联系
public class Thread extends Object implements Runnable
可以看出Thread类也是Runnable接口的子类
三、代码
MainActivity代码:
package bnuz.it.wjy.hellothread;import androidx.appcompat.app.AppCompatActivity;import android.mtp.MtpConstants;
import android.os.Bundle;
import android.view.View;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void btnOnclick(View view){// testThread();
// testRunnable();testSale();}public void testThread(){MyThread mt1 = new MyThread();MyThread mt2 = new MyThread();mt1.start();mt2.start();}public void testRunnable(){MyRunnable mr1 = new MyRunnable();MyRunnable mr2 = new MyRunnable();Thread t1 = new Thread(mr1);
// Thread t2 = new Thread(mr2);
// 多个Thread对象可以共用一个mr
// 线程同步Thread t2 = new Thread(mr1);t1.start();t2.start();}public void testSale(){SaleTicket saleTicket = new SaleTicket();Thread t1 = new Thread(saleTicket,"A代理");Thread t2 = new Thread(saleTicket,"B代理");Thread t3 = new Thread(saleTicket,"C代理");Thread t4 = new Thread(saleTicket,"D代理");t1.start();t2.start();t3.start();t4.start();}
}
布局代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Thread"android:id="@+id/Thread"android:onClick="btnOnclick"/>
</RelativeLayout>
MyThread类
package bnuz.it.wjy.hellothread;import android.util.Log;public class MyThread extends Thread{@Overridepublic void run() {Log.d("TAG",Thread.currentThread().getName()+".run()");}
}
MyRunnable类
package bnuz.it.wjy.hellothread;import android.util.Log;public class MyRunnable implements Runnable{@Override
// 必须是实现run()方法public void run() {Log.d("TAG",Thread.currentThread().getName()+".run()");}
}
SaleTicket类
package bnuz.it.wjy.hellothread;import android.util.Log;public class SaleTicket implements Runnable{private int ticket = 20;@Overridepublic void run() {while (true){if(ticket > 0){Log.d("TAG",Thread.currentThread().getName()+"卖出了第"+(20-ticket+1)+"张票");ticket--;}else{break;}}try {Thread.sleep(200);}catch (InterruptedException e){e.printStackTrace();}}
}
继承Thread类实现多线程简单实例相关推荐
- Java继承Thread类创建多线程
Java继承Thread类创建多线程 单线程示例 示例,Example01.java public class Example01{public static void main(String[] a ...
- html解析图片url,并用继承Thread类的多线程下载
html解析图片url,并用继承Thread类的多线程下载 pom依赖 Java代码 把对应网页的img元素,通过继承Thread类的多线程下载下来. pom依赖 <dependencies&g ...
- 继承Thread类使用多线程
java实现多线程有两种方式,一种是继承Thread类,另外一种就是实现Runnable接口. 两种实现方法的优缺点: 使用Thread类实现多线程局限性就是不支持多继承,因为java是不支持类多继承 ...
- 多线程之继承Thread类及多线程内存分析
*创建多线程的一种方式:继承Thread类 * java.lang.Thread是描述多线程的类,要实现多线程程序,一种方式就是继承Thread类 * 1.创建一个类Mythread让其extends ...
- 【Java多线程】实现Runnable接口方式 / 继承Thread类方式;使用synchronized锁实现线程安全;线程安全的懒汉式单例模式;死锁问题示例
Thread 的生命周期 一.实现Runnable接口方式 1.在 run 方法中使用 synchronized 块 /*** 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的 ...
- Thread类实现多线程
线程主体类:必须是实现特定的接口或者继承特定的父类才可以完成. 继承Thread类实现多线程 java.lang.Thread 一个类继承了此类表示这个类就是线程的主体类,并且需要覆写线程的主体方法r ...
- android 如何extends 多个,Android多线程:继承Thread类 使用解析(含实例教程)
前言 在Android开发中,多线程的使用十分常见 今天,我将全面解析多线程其中一种常见用法:继承Thread类. 目录 示意图 1. 简介 示意图 2. 使用讲解 2.1 使用步骤 示意图 2.2 ...
- JavaSE基础二十:Java 多线程(线程基础知识、Java 多线程、Java 实现多线程(继承 Thread 类、实现 Runnable 接口、实现 Callable 接口))
本章目录 1.基础知识准备 2.Java 多线程概述 3.Java 实现多线程 3.1.继承 Thread 类 如何开启新线程 Thread 类常用方法 多线程中的同步 Thread 类同步方法 多线 ...
- java线程如何继承,java多线程(一)之继承Thread类
一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...
最新文章
- 2021年春季学期-信号与系统-第四次作业参考答案-第十二小题
- ffmpeg图片压缩为视频
- 【IM】关于聚类评价算法的理解
- 杭州水利水电学院计算机多少学,杭州的一所很容易考上的公办本科大学——浙江水利水电学院...
- gearhost php,Gearhost 免费主机的申请
- IDEA 学习笔记之 安装和基本配置
- cnn对网络数据预处理_CNN中的数据预处理和网络构建
- LeetCode - Easy - 637. Average of Levels in Binary Tree
- C程序设计语言现代方法04:表达式
- Windows Server 2016-Windows控制台的新增功能
- [CTO札记]雅虎主页改版使用户停留时间增加20% -
- jQuery右键菜单ContextMenu使用笔记
- 将PDF论文的公式截图后转成Word可编辑公式
- 中国脑计划颠覆性创新之路四,用脑科学预测互联网的未来发展趋势
- 是什么导致了脸上的痤疮呢?
- ADC采样频率的计算
- java内存图解_java内存模型及GC原理 和 图解JVM在内存中申请对象及垃圾回收流程...
- eclipse neno高级安装
- 【Vuejs】1017- Vue3 效率提升主要表现在哪些方面?
- Air202掉坑日记(2)——连接阿里云成功后自动掉线(AT版本)