多线程
多线程
线程可以有如下6种状态:
- New (新建)
- Runnable (可运行)
- Blocked (阻塞)
- Waiting (等待)
- Timed waiting (计时等待)
- Terminated (终止)
要获得一个线程的状态,只需要调用getState方法
新建线程
当使用new操作符创建一个新线程时,如new Thread(r),这个线程还没有开始运行.
这意味着它的状态是新建(new).
可运行线程
一旦调用start方法,线程就处于可运行状态(Runnable)
一个可运行的线程可能正在运行也可能没有运行
阻塞和等待线程
当线程处于阻塞或者等待状态时,它暂时是不运动的.它不运行任何代码,而且消耗最少的资源. 要由线程调度器重新激活这个线程
当一个线程视图获取一个内部的对象锁.而这个锁目前被其他线程占用,该线程就会被阻塞. 当所有的线程都释放了这个锁,并且线程调度器允许该线程持有这个锁时,他将变成非阻塞状态.
当线程等待另一个线程通知调度器出现一个条件时,这个线程会进入等待状态. 调用Object.wait方法或者Thread.join方法,或者等待Java.util.concurrent库中的lock或Condition时, 就会 出现这种状况. 实际上阻塞状态和等待状态没有太大区别
计时等待
有几个方法有超时参数,调用这些方法会让线程进入计时等待状态.这一状态将一直保持到超时期满或者接收到适当的通知. 带有超时参数的方法有:
Thread.sleep 和计时版的Object.wait,Thread.join.Lock.tryLock 以及Condition.await
终止线程
线程会由于以下两个原因之一而终止
- run方法正常退出,线程自然终止
- 因为一个没有捕获的异常终止了run方法,使线程意外终止
具体来说,可以调用线程的stop方法杀死一个线程,该方法抛出一个ThreadDeath错误对象,这会杀死线程.不过这个方法已经废弃,请永远不要使用/
线程属性
中断线程
interrupt方法
可以请求终止一个线程
当对一个线程调用interrupt方法时候,就会设置线程的中断状态.这时每个线程都有的boolean标志.每个线程都应该不时地检查这个标志,以判断线程是否被中断.
但是如果一个线程被阻塞,就无法检查中断状态.这里就要引入InterruptedException异常
守护线程
可以通过调用
t.setDaemon(true)
守护线程是唯一用途是为其他线程提供服务