首页 > 代码库 > 线程优先级
线程优先级
在初识并发这篇博客提到过,Java的线程机制是抢占式的:这表示调度机制会周期性地中断线程,将上下文切换到另一个线程,从而为每隔线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。
尽管CPU处理现有线程集的顺序是不确定的,但是调度器倾向于让优先权最高的线程先执行,而优先权较低的线程并非没有机会执行,只是执行的频率较低。我们可以用getPriority()读取现有线程的优先级,使用setPriority来修改它:
public class LiftOff implements Runnable { public LiftOff(int priority){ taskCount++;// 计数自增 this.priority = priority; } private int countDown = 3; // 倒计时数字 private static int taskCount = 0; private int id = taskCount; private int priority; @Override public void run() { Thread.currentThread().setPriority(priority);//设置优先级 Thread.currentThread()可获得对驱动该任务的Thread()对象的引用 while (countDown >= 0) { System.out.println("线程编号" + id + "--倒计时" + countDown); countDown--; if(countDown < 0){ System.out.println(Thread.currentThread() + ":" + id); } } }}
调用线程启动任务:
public class Launch { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(new LiftOff(Thread.MAX_PRIORITY)); executor.execute(new LiftOff(Thread.MIN_PRIORITY)); }}
输出:
线程编号0--倒计时3
线程编号1--倒计时3
线程编号1--倒计时2
线程编号0--倒计时2
线程编号0--倒计时1
线程编号0--倒计时0
线程编号1--倒计时1
Thread[pool-1-thread-1,10,main]:0
线程编号1--倒计时0
Thread[pool-1-thread-2,1,main]:1
可以发现我们通过构造函数设置的线程优先级并没有起到预想的效果,java编程思想的作者提供了一个程序,在任务之中加入复杂的计算操作,以便让线程调度器得以介入并优先执行优先级高的线程,用他的话说”至少在我的WINXP“系统中是这样。很遗憾,我在我的电脑上并没有得到预期的效果。
所以,在绝大多数时间里,所有线程都应该以默认的优先级运行。试图操纵线程优先级通常是一种错误。
线程优先级
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。