多线程

线程可以有如下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)

守护线程是唯一用途是为其他线程提供服务