java线程模型

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的多线程实现是基于抢占模型的,但是并不绝对,因此想根据抢占模型实现某种绝对的抢占线程是不行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值