建立两个不同优先级的线程,发现线程建立的顺序,会影响线程抢占CPU的时间,而优先级的设置不起作用,请问这怎么解释?
代码如下:
1 public class PriorityDemo { 2 public static void main(String[] args) { 3 PriThread mt1 = new PriThread("High Priority", Thread.NORM_PRIORITY+2); 4 PriThread mt2 = new PriThread("Low Priority", Thread.NORM_PRIORITY-2); 5 mt2.thrd.start(); 6 mt1.thrd.start(); 7 8 try { 9 mt1.thrd.join();//等待线程终止 10 mt2.thrd.join(); 11 } catch (InterruptedException e) { 12 System.out.println("Main thread interrupted."); 13 } 14 System.out.println("\nHigh priority thread counted to " + mt1.count); 15 System.out.println("\nLow priority thread counted to " + mt2.count); 16 } 17 } 18 class PriThread implements Runnable { 19 20 long count; 21 Thread thrd; 22 23 static boolean stop = false; 24 public PriThread(String name, int pri) { 25 thrd = new Thread(this, name); 26 thrd.setPriority(pri); 27 count = 0; 28 //thrd.start(); 29 } 30 @Override 31 public void run() { 32 do { 33 count++; 34 if ((count % 10000) == 0) { 35 if(thrd.getPriority() > Thread.NORM_PRIORITY) { 36 //Thread.yield(); 37 count = count; 38 } 39 } 40 } while (stop == false && count < 100000000); 41 stop = true; 42 } 43 }
运行结果为:
High priority thread counted to 100000000
Low priority thread counted to 75062915
但是交换3,4行的顺序,结果为:
High priority thread counted to 74776252
Low priority thread counted to 100000000
这是为什么呢?
由于你的程序中stop声明的是static boolean类型,
这导致在while判断
while (stop == false && count < 100000000);
stop的变量不是最后修改后的变量, 需要将stop声明为:
static volatile boolean stop = false;
不过改过以后出现了说到的问题了。
我猜测这引起的原因应该是对共享的变量stop调用产生的, 因此对程序进行了修改, 如下:
public class PriorityDemo { public static void main(String[] args) { PriThread mt1 = new PriThread("High Priority", Thread.NORM_PRIORITY+2); PriThread mt2 = new PriThread("Low Priority", Thread.NORM_PRIORITY-2); mt1.thrd.start(); mt2.thrd.start(); try { Thread.sleep(10); } catch (InterruptedException e) { System.out.println("Main thread interrupted."); } mt1.stop = true; mt2.stop = true; try { mt1.thrd.join();//等待线程终止 mt2.thrd.join(); } catch (InterruptedException e) { System.out.println("Main thread interrupted."); } System.out.println("\nHigh priority thread counted to " + mt1.count); System.out.println("\nLow priority thread counted to " + mt2.count); } } class PriThread implements Runnable { long count; Thread thrd; volatile boolean stop = false; public PriThread(String name, int pri) { thrd = new Thread(this, name); thrd.setPriority(pri); count = 0; //thrd.start(); } public void run() { do { count++; } while (stop == false && count < 100000000); } }
发现, 此时将不会出现你所说的现象。
更深入的机制也不是很清除, 希望对你有所帮助。
谢谢你的回答。你的方法也可以验证优先级的作用,我就是不明白为什么会出现我的得出的那种问题呢。
优先级只是一种理想情况下 没有说优先级高的一定先处理 多线程 是非常复杂的东西
不要在意这些细节