知行社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2894|回复: 0
收起左侧

java线程模型

[复制链接]
qoevdav 发表于 2012-1-8 03:00 | 显示全部楼层 |阅读模式
Java运行时系统实现了一个用于调度线程执行的线程调度器,用于确定某一时刻由哪一个线程在CPU上运行。
注意线程一般都是靠操作系统调度完成的,但是java实现了自己的线程调度模型,即抢占式调度模型

抢占式调度模型
在java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的进程)。抢占式调度模型就是许多线程处于可以运行状态(等待状态),但实际上只有一个线程在运行。该线程一直运行到它终止进入可运行状态(等待状态),或者另一个具有更高优先级的线程变成可运行状态。在后一种情况下,低优先级的线程被高优先级的线程抢占,高优先级的线程获得运行的机会。

Java线程调度器支持不同优先级线程的抢先方式,但其本身不支持相同优先级线程的时间片轮换
Java运行时系统所在的操作系统(例如:Windows2000)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。

关于操作系统时间片段的轮换
在程序的执行过程当中,某一个时刻只能有一个线程运行,那为什么我们在启动多个进程或者一个进程多个线程的时候,我们看到这几个进程或线程在同时运行呢?
这是因为在单个CPU的情况下,操作系统决定会在一个极短的时间片段中执行一个线程,那么当这个时间片段运行结束以后,系统会决定运行其他的一个线程。因为这个时间片段很短,频繁着发生切换,给我们的感觉就好象是这几个线程同时在运行一样。

问题:既然在单CPU情况下,某一个时刻只能有一个线程运行,那么我们为什么要设计多线程呢?我们能不能够设计多进程来代替多线程呢?
我们在程序设计的时候应该考虑到程序的可移植性,当这个程序放到多CPU平台下的时候,同时运行多个线程,从而达到真正意义上的并发运行。

示例:
Thread类
static void yield()暂停当前正在执行的线程对象,并执行其他线程。
void setPriority(int newPriority)更改线程的优先级。
静态常量:
static int MAX_PRIORITY 10
线程可以具有的最高优先级。
static int MIN_PRIORITY 1
线程可以具有的最低优先级。
static int NORM_PRIORITY 5
分配给线程的默认优先级。
class MultiThread{        public static void main(String[] args)        {                MyThread mt=new MyThread();                mt.setPriority(Thread.MAX_PRIORITY);                mt.start();                int index=0;                while(true)                {                        System.out.println("main:"+Thread.currentThread().getName());                }        }}class MyThread extends Thread{        public void run()        {                while(true)                {                        System.out.println(Thread.currentThread().getName()+":"+index++);                        yield();                }        }}执行结果:
Thread-0
。。。。。
。。。。。
main:main
Thread-0
。。。。。
。。。。。
这个例子很有力的说明了java线程的抢占式调度模型,在MyThread 类中的run方法当中调用了父类Thread的yield();用于释放当前的线程资源,让其他线程执行,MyThread 虽然释放了线程,但是main线程仍然没有被执行,MyThread 同时又获得了执行的资格,原因就在于mt.setPriority(Thread.MAX_PRIORITY);设置了MyThread 的线程优先级别高于main线程。
但是问题又来了:就是抢占式调度模型并不绝对,main线程还是会在MyThread 线程执行一段时间之后,偶尔能够获得执行的资格,从打印语句上就可以看出来

总结:java的多线程实现是基于抢占模型的,但是并不绝对,因此想根据抢占模型实现某种绝对的抢占线程是不行的。

QQ|小黑屋|手机版|知行技术社区 ( 湘ICP备11020288号-1 )

GMT+8, 2020-9-26 07:19 , Processed in 0.068074 second(s), 8 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表