线程的概念
主线程是指进程拥有的线程,或叫UI线程,Java中默认情况下一个进程只有一个线程,这个线程就是主线程。主线程不能执行耗时的任务,所以在一些耗时处理时,就得使用子线程。Android沿用了Java的线程模型,从Android3.0开始系统要求网络访问也必须在子线程中进行,否则网络访问将会失败并抛出NetworkOnMainThreadException异常。在Android里如果主线程被执行耗时任务导致阻塞后还会造成ANR的发生。
线程五个基本状态
新建状态(New)线程对象创建后就会进入了新建状态,如:Thread t = new MyThread();
就绪状态(Runnable)当调用线程对象的start()方法后,如:t.start();,线程进入就绪状态。此状态的线程只是明确做好了准备,随时等待CPU调度执行,并未开始执行
运行状态(Running)当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。
阻塞状态(Blocked)处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,阻塞状态后要再到运行状态,必须是先经过就绪状态。
死亡状态(Dead)线程执行完了或者因异常退出了run()方法,该线程结束生命周期
线程的阻塞情况
等待阻塞:运行状态中的线程执行一个对象wait()方法挂起线程时,使本线程进入到等待阻塞状态,直到其他线程执行notify()或者notifyAll()方法。
同步阻塞:线程执行一段同步代码,但尚无法获得相关同步锁,例如获取synchronized同步锁失败(因为锁被其它线程所占用),那么线程会进入同步阻塞状态,直到等到获取同步锁。
其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
多线程的使用
Java中主要提供两种方式实现线程,分别为继承java.lang.Thread类与实现java.lang.Runnable接口。
继承Thread类
class MyThread extends Thread {
@Override
public void run() {
//TODO...
}
}
// 调用使用线程
Thread myThread = new MyThread(); // 新建状态
myThread.start(); // 就绪状态
实现Runable接口
class MyRunnable implements Runnable