一、线程创建
1、继承线程 Thread 类:
·class TestThread extends Thread
2、实现 Runnable 接口
·class TestThread implements Runnable
·然后 new Thread(new Thread()).start
·这里实际上是new TestThread() 这个实现 Runnable 接口的类,然后把这个类传入Thread
·源码中,内部保存 TestThread ,然后默认的Thread run 方法执行 TestThread 的 run 方法
3、匿名类
·new Thread(new Runnable())
4、使用 lambda
·new Thread(()->{线程执行体}).start();
二、线程生命周期
线程对象使用 isAlive() 方法判断线程状态。就绪、运行、阻塞时值为true,新建、死亡状态为false。
1、新建
·新建一个线程
2、就绪
·已经start,等待CPU 获取执行权
3、运行
·已经获取执行权,开始执行Run() 方法的线程执行体,线程处于运行状态
4、阻塞
·线程在运行的过程中暂停等待某个条件触发
5、死亡(线程结束状态)
·run() 或者 call() 方法执行完成,线程正常结束
·线程跑出一个未被捕捉的 Exception 或者 Error
·调用改线程的stop() 方法结束线程,容易造成线程死锁(死锁–两个及以上线程同时持有对方所需要的资源)
·可以Boolean 标记的形式完成线程,只要在某一情况下将标记改变让循环停止即可结束线程
三、Android 中多线程实现方式
1、Handler + Thread
(1)优缺点
· Handler用法简单明了,可以将多个异步任务更新UI的代码放在一起,清晰明了
· 处理单个异步任务代码略显多
(2)使用范围
·多个异步任务的更新UI
(3)使用
·新建一个Handler对象,重写其中的handlerMessage()
·新建一个线程,执行线程执行体,子线程使用Handler发送信息通知主线程更新
·根据信息触发handlerMessage()这个回调方法来执行UI界面的更新
2、AsyncTask(轻量级异步类)
(1)优缺点
· 处理单个异步任务简单,可以获取到异步任务的进度
·可以通过cancel方法取消还没执行完的AsyncTask
· 处理多个异步任务代码显得较多
(2)适用范围
·单个异步任务的处理
(3)使用
·创建 AsyncTask 子类 & 根据需求实现核心方法
·创建 AsyncTask子类的实例对象(即 任务实例)
·手动调用execute() 从而执行异步线程任务
3、IntentService
(1)一个可以处理异步任务的简单Service
(2)使用
·继承IntentService
·实现不带参数的构造方法,并且调用父类的IntentService的构造方法
4、ThreadPoolExecutor
·适用范围——批处理任务
四、线程阻塞原因
1、等待I/O流的输入输出
2、等待网络资源,即网速问题
3、调用sleep() 方法,需要等待sleep 时间结束
4、调用wait() 方法,需要调用 notify() 唤醒线程
5、其他线程执行join() 方法,当前线程则会阻塞,需要等其他线程执行完毕