main方法中设置线程优先级,子线程优先级也发生改变

ChillChilling 2017-07-05 10:07:09
package thread;

public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws InterruptedException{
System.out.println(Thread.currentThread().getName()+" m1()的优先级 "+Thread.currentThread().getPriority());
System.out.println("m1()1: b = " + b);
b = 1000;
System.out.println("m1()2: b = " + b);
//Thread.sleep(400);
//System.out.println("m1(): b = " + b);
}

public void m2() throws InterruptedException{
System.out.println(Thread.currentThread().getName()+" m2()的优先级 "+Thread.currentThread().getPriority());
//Thread.sleep(100);
System.out.println("m2()1: b = " + b);
b = 2000;
System.out.println("m2()2: b = " + b);
}
@Override
public void run() {
try {
m1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
TT tt = new TT();
Thread thread = new Thread(tt);

thread.setPriority(Thread.MAX_PRIORITY);
System.out.println(Thread.currentThread().getName()+Thread.currentThread().getPriority());

thread.start();
tt.m2();

System.out.println(tt.b);
}
}

执行结果有多种:
main1
main m2()的优先级 1
m2()1: b = 100
Thread-0 m1()的优先级 10
m1()1: b = 2000
m1()2: b = 1000
m2()2: b = 2000//有问题了,为什么不是1000
1000
执行结果 m1()1 b=2000,说明m2()的修改操作已经进行,然后m1()的修改操作也进行了,最后b应该为1000,为什么m2()2的b还可以变成2000。
-------------------------------
main1
main m2()的优先级 1
m2()1: b = 100
m2()2: b = 2000
Thread-0 m1()的优先级 10
m1()1: b = 2000
m1()2: b = 1000
2000//有问题了,为什么不是1000
-------------------
main1
main m2()的优先级 1
m2()1: b = 100
m2()2: b = 2000
2000
Thread-0 m1()的优先级 10
m1()1: b = 2000
m1()2: b = 1000
正常
----------------------
main1
main m2()的优先级 1
m2()1: b = 100
Thread-0 m1()的优先级 10
m1()1: b = 2000
m2()2: b = 2000
1000
m1()2: b = 1000
m2修改为2000,m2()2输出后,m1修改为1000,main输出tt.b,m1()2输出
...全文
389 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChillChilling 2017-07-06
  • 打赏
  • 举报
回复
题目起错了,应该是线程执行出现了混乱。。求各为大大解答!
soton_dolphin 2017-07-06
  • 打赏
  • 举报
回复
引用 1 楼 BaiJJMM 的回复:
main1 main m2()的优先级 1 Thread-0 m1()的优先级 10 m1()1: b = 100 m1()2: b = 1000 //m1()已经将b修改为1000 m2()1: b = 100 //为何还会输出b=100 m2()2: b = 2000 2000
变量b 被两个线程共享,在执行m1的线程还没有完成的时候,m2()里面看到b的值不一定会被更新。如果你在m2()上面也加syncrhonized 就没事儿了。 还有线程优先级只是给cpu一个提示,并不会控制cpu执行线程的顺序。
ChillChilling 2017-07-06
  • 打赏
  • 举报
回复
main1 main m2()的优先级 1 Thread-0 m1()的优先级 10 m1()1: b = 100 m1()2: b = 1000 //m1()已经将b修改为1000 m2()1: b = 100 //为何还会输出b=100 m2()2: b = 2000 2000

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧