文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
2.6 先干重要的事:线程优先级
Java中的线程可以有自己的优先级。优先级高的线程在竞争资源时会更有优势,更可能抢占资源,当然,这只是一个概率问题。如果运气不好,高优先级线程可能也会抢占失败。由于线程的优先级调度和底层操作系统有密切的关系,在各个平台上表现不一,并且这种优先级产生的后果也可能不容易预测,无法精准控制,比如一个低优先级的线程可能一直抢占不到资源,从而始终无法运行,而产生饥饿(虽然优先级低,但是也不能饿死它呀)。因此,在要求严格的场合,还是需要自己在应用层解决线程调度问题。
在Java中,使用1到10表示线程优先级。一般可以使用内置的三个静态标量表示:
public final static int MIN_PRIORITY = 1; public final static int NORM_PRIORITY = 5; public final static int MAX_PRIORITY = 10;
数字越大则优先级越高,但有效范围在1到10之间。下面的代码展示了优先级的作用。高优先级的线程倾向于更快地完成。
01 public class PriorityDemo { 02 public static class HightPriority extends Thread{ 03 static int count=0; 04 public void run(){ 05 while(true){ 06 synchronized(PriorityDemo.class){ 07 count++; 08 if(count>10000000){ 09 System.out.println("HightPriority is complete"); 10 break; 11 } 12 } 13 } 14 } 15 } 16 public static class LowPriority extends Thread{ 17 static int count=0; 18 public void run(){ 19 while(true){ 20 synchronized(PriorityDemo.class){ 21 count++; 22 if(count>10000000){ 23 System.out.println("LowPriority is complete"); 24 break; 25 } 26 } 27 } 28 } 29 } 30 31 public static void main(String[] args) throws InterruptedException { 32 Thread high=new HightPriority(); 33 LowPriority low=new LowPriority(); 34 high.setPriority(Thread.MAX_PRIORITY); 35 low.setPriority(Thread.MIN_PRIORITY); 36 low.start(); 37 high.start(); 38 } 39 }
上述代码定义两个线程,分别为HightPriority设置为高优先级,LowPriority为低优先级。让它们完成相同的工作,也就是把count从0加到10000000。完成后,打印信息给一个提示,这样我们就知道谁先完成工作了。这里要注意,在对count累加前,我们使用synchronized产生了一次资源竞争。目的是使得优先级的差异表现得更为明显。
大家可以尝试执行上述代码,可以看到,高优先级的线程在大部分情况下,都会首先完成任务(就这段代码而言,试运行多次,HightPriority总是比LowPriority快,但这不能保证在所有情况下,一定都是这样)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论