Java实现线程的三种方式(2)

Java线程在JDK1.2之前,是基于称为“绿色线程”(Green Threads)的用户线程实现的,而在JDK1.2中,线程模型替换为基于操作系统原生线程模型来实现。因此,在目前的JDK版本中,操作系统支持怎样的线程模型,在很大程度上决定了Java虚拟机的线程是怎样映射的,这点在不同的平台上没有办法达成一致,虚拟机规范中也并未限定Java线程需要使用哪种线程模型来实现。线程模型只对线程的并发规模和操作成本产生影响,对Java程序的编码和运行过程来说,这些差异都是透明的。

对于Sun JDK来说,它的Windows版与Linux版都是使用一对一的线程模型实现的,一条Java线程就映射到一条轻量级进程之中,因为Windows和Linux系统提供的线程模型就是一对一的。

而在Solari平台中,由于操作系统的线程特性可以同时支持一对一(通过Bound Threads或Alternate Libthread实现)及一对多(通过LWP/Thread Based Synchronization实现)的线程模型,因此在Solaris版的JDK中也对应提供了两个平台专有的虚拟机参数:-XX:+UseLWPSynchronization(默认值)和-XX:+UseBoundThreads来明确指定虚拟机使用哪种线程模型。

Java线程调度

线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种:

1)协同式线程调度(Cooperative Threads-Scheduling)

2)抢占式线程调度(Preemptive Threads-Scheduling)

如果使用协同式调度的多线程系统,线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后,要主动通知系统切换到另外一个线程上。协调式线程调度:

好处:

1)实现简单

2)没有线程同步问题。由于线程要把自己的事情干完后才会进程线程切换,切换操作对线程自己是可知的,所以没有什么线程同步问题。Lua语言中的“协调例程”就是这类实现。

坏处:

1)线程执行时间不可控制

2)甚至如果一个线程编写有问题,一直不告知系统进行线程切换,那么程序就会一直阻塞在那里。很久以前的Windows 3.x系统就是使用协同式来实现多进程多任务的,相当不稳定,一个进程坚持不让出CPU执行时间就可能会导致整个系统崩溃。

如果使用抢占式调度的多线程系统,那么每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定(在Java中,Thread.yield()可以让出执行时间,但是要获取执行时间的话,线程本身是没有什么办法的)。抢占式线程调度:

好处:

1)线程的执行时间是系统可控的

2)也不会有一个线程导致整个进程阻塞的问题。Java使用的线程调度方式就是抢占式调度。与前面所说的Windows 3.x的例子相对,在Windows 9x/NT内核中就是使用抢占式来实现多进程的,当一个进程出了问题,我们还可以使用任务管理器把这个进程“杀掉”,而不至于导致系统崩溃。

Java语言一共设置了10个级别的线程优先级(Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在两个线程同时处于Ready状态时,优先级越高的线程越容易被系统选择执行。

不过,线程优先级并不是太靠谱,原因是Java的线程是通过映射到系统的原生线程上来实现的,所以线程调度最终还是取决于操作系统,虽然现在很多操作系统都提供线程优先级的概念,但是并不见得能与Java线程的优先级一一对应。

Solaris中有232种优先级,Windows中只有7种。Windows平台JDK中使用了除THREAD_PRIORITY_IDLE之外的其余6种线程优先级。

Java线程优先级与Windows线程优先级之间的对应关系:

Java线程优先级   Windows线程优先级  
1(Thread.MIN_PRIORITY)   THREAD_PRIORITY_LOWEST  
2   THREAD_PRIORITY_LOWEST  
3   THREAD_PRIORITY_BELOW_NORMAL  
4   THREAD_PRIORITY_BELOW_NORMAL  
5(Thread.NORM_PRIORITY)   THREAD_PRIORITY_NORMAL  
6   THREAD_PRIORITY_ABOVE_NORMAL  
7   THREAD_PRIORITY_ABOVE_NORMAL  
8   THREAD_PRIORITY_HIGHEST  
9   THREAD_PRIORITY_HIGHEST  
10(Thread.MAX_PRIORITY)   THREAD_PRIORTIY_CRITICAL  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/92d09bcc03861404b14b5f06942efad2.html