问题描述:
<font color=#999AAA >多个线程同时运行,给重要的线程设置优先级高,不重要的设置优先级低,但是实际运行过程中,重要的线程不一定每次都先运行。 </font>
代码:
public class ThreadDemo3 implements Runnable {
public StringBuffer log = new StringBuffer();
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
log.append((Thread.currentThread()).getName() + ":" + i + " ");
if (i % 10 == 0) {
log.append("\n");
}
}
}
public static void main(String[] args) throws Exception {
ThreadDemo3 threadDemo3 = new ThreadDemo3();
Thread xc1 = new Thread(threadDemo3, "线程1");
Thread xc2 = new Thread(threadDemo3, "线程2");
//设置优先级
xc1.setPriority(Thread.MAX_PRIORITY);
xc2.setPriority(Thread.MIN_PRIORITY);
xc1.start();
xc2.start();
Thread.sleep(2000);
System.out.println(threadDemo3.log);
}
}
结果:线程一的优先级高,反而后执行
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
原因分析:
<font color=#999AAA >处理器是多核的。
这段代码在单核CPU上一定是先线程一后线程二的,但是现在处理器都是多核的,多核CPU是可以真正实现多个线程同时运行的,而不是简单的快速切换的假象,每个核心都能够负责一个线程,有可能线程一对应的核心,调度比较慢,线程二调度快一点,所以造成了线程二先运行的</font>
这就是线程即使设置了优先级,运行任然具有随机性的原因
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
解决方案:
你可以把你的CPU核心关掉一些,只留下一个核心工作,再运行这个。
关闭多核CPU核心的方法:
开始,运行,输入:MSCONFIG再点 BOOT.INI 找到高级选项,点开 /NUMPROC9(N)= 里面只选1就关掉另外的核了,如果你是四核,里面有1 2 3 4可选,点2就是只能当双核用,以此类推。
PS:我的是Mac系统,没有进行测试,有没有大佬测试一下?给个准确的回复看看不,探索的路上,大家一起加油!
怎么让一个线程一定优先运行?
不管是t1、t2、t3谁先运行,最终的结果,一定是t1先运行完,然后是t2运行完,最后是t3
public static void main(String[] args) {
final Thread T1 = new Thread(new Runnable() {
public void run() {
System.out.println("T1 run");
}
});
final Thread T2 = new Thread(new Runnable() {
public void run() {
System.out.println("T2 run");
try{
T1.join();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("T2 run end");
}
});
Thread T3 = new Thread(new Runnable() {
public void run() {
System.out.println("T3 run");
try{
T2.join();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("T3 run end");
}
});
T1.start();
T2.start();
T3.start();
}
|