[转]Java线程

Java线程模型所要面对的几个问题

1.  线程状态机

2.  平台相关性和线程优先级

3.  调度模型

4.  线程同步和锁

 

 

 

 

Java线程状态机

JDK1.5 定义了六种线程状态:

  • NEW – 刚刚创建,还没有启动(start)

  • RUNNABLE – 正处于可执行状态的线程

  • BLOCKED – 正在等待其它线程释放一个同步锁或等待IO

  • WAITING - 正在等待其它线程通知(Object.notify() or notifyAll())

  • TIMED_WAITING - 正在等待其它线程通知,包含最长等待时间

  • TERMINATED – 已经终止运行的线程

CLDC库中没有定义这几种状态,但实际实现的时候仍然包含这几种状态,因为线程的状态转换都差不多。

原有的方法Thread.stop(), Thread.stop(Throwable), Thread.suspend(), Thread.resume(),由于可能引起死锁已经建议不再使用, 方法Runtime.runFinalizersOnExit()也由于会对正在使用的对象调用finalize方法而不再被推荐使用。同样ThreadDeath异常也不应该被用作检测线程终止的条件。从上图可以看出,让线程暂停的方法包括调用wait(), join(), sleep(), 或者等待IO操作,或者等待一个线程锁。让一个线程恢复运行的方法应该由虚拟机自动管理,可以是等待的对象发出了通知或等待超时,sleep的时间到了,IO事件触发或被中断,同步锁被释放等等。

方法Thread.interrupt()可以唤醒阻塞在wait(), join(), sleep()上面的线程,如果线程正在等待一个可中断的IOInterruptibleChannel)上,该Channel将被关闭。具体请参见JDK1.5 API 文档。

平台相关性和线程优先级

历史上,Java线程最初使用的是“绿色”线程,也就是多个线程由虚拟机进行模拟,对操作系统来说只存在虚拟机一个进程,这样的处理结果是跨平台非常容易,缺点是在多CPU系统上没办法使用多个CPU,由于现代操作系统处理线程的能力已经很强,绿色线程的缺点越发的明显,但由于其实现的简单性,很多嵌入式java虚拟机仍然在使用它。

       Hotspot虚拟机通过把Java线程映射到操作系统线程来提高线程管理的效率,但是在NT下,最多只有7个优先级划分,却必须映射到Java10个等级。因此,在NT下依靠优先级来调度线程时存在很多问题,而且NT下进程的优先级是可调的,更增加了复杂性。 SolarisLinux最新版都支持了LWP,而且优先级对于Java来说足够使用,Hotspot虚拟机在Solaris下已经使用了LWP,使用M-N映射,但Linux上面不知道是否已经做了支持,毕竟最新的Linux版本对线程已经做了很大的改动。

      

线程的调度模型

线程之间的切换一般分为协作式和抢占式,Java虚拟机在绿色线程年代一直使用抢占式来分配时间片,时间片的大小正比于指定的优先级。Hotspot虚拟机由于使用了操作系统的线程,实际的调度由操作系统完成。但Java程序员仍然可以通过调用wait, sleep, notify, notifyAll等方法和synchronized关键字来实现线程之间的协作。

你可能感兴趣的:(J2SE+JSP,java,虚拟机,solaris,linux,join,io)