求问关于线程的程序执行问题

yangzhen0126 2016-10-20 04:59:50
程序如图,运行结果为1000 b=1000,谁能说一下程序执行的过程,为什么第一行会出1000,而不是2000
...全文
527 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewMoons 2016-11-05
  • 打赏
  • 举报
回复
9楼是是是是是是正解。
休息的风 2016-10-25
  • 打赏
  • 举报
回复
楼主会问这上问题,其实是还没理解线程是如何工作的。 对于这段程序会会打印出哪个值,是跟CUP时间片轮转有关的。代码涉及到两个线程,一个是main线程,一个是新开的t线程;当main执行到t.start()时,接下来就是main和t在抢cup的资源的,谁先抢到就先执行谁的。所以对于执行结果来说,其实是随机的,你没法确实会先执行谁的。如果要确保t先执行,可以在t.start()后,加上t.join()就会等t先执行完再执行main的线程。建议可以看下java多线程编程核心技术
bichir 2016-10-22
  • 打赏
  • 举报
回复
3楼说得对,线程是异步的。这个代码中执行结果不是唯一的,有可能是1000,有可能是2000。因为你不知道当主线程执行到print时子线程有没执行完。有可能执行完了,也可能没执行完。如果你在print上面用个sleep停1,2钟你会发现结果会是2000.
yannsPeng 2016-10-22
  • 打赏
  • 举报
回复
同求为什么debug的时候测试的结果和直接跑出来的结果不一样?
yannsPeng 2016-10-22
  • 打赏
  • 举报
回复

yannsPeng 2016-10-22
  • 打赏
  • 举报
回复
没看完代码,我才是全局变量和局部变量的原因
yangzhen0126 2016-10-21
  • 打赏
  • 举报
回复
引用 3 楼 爱笑容下的悲伤的回复:
你创建的线程还没执行完,就已经执行到了tt.m2()
能详解吗?两个方法都被锁定了,不是必须等一个方法执行完才能执行另一个吗?即使先执行主线程也应该是2000啊
  • 打赏
  • 举报
回复
你创建的线程还没执行完,就已经执行到了tt.m2()
yangzhen0126 2016-10-20
  • 打赏
  • 举报
回复
引用 1 楼 NewMoons 的回复:
拜托能把代码发上来么?
代码: package Thread; public class TT implements Runnable { int b = 100; public synchronized void m1() throws Exception{ //Thread.sleep(2000); b = 1000; Thread.sleep(5000); System.out.println("b = " + b); } public synchronized void m2() throws Exception { Thread.sleep(2500); b = 2000; } public void run() { //System.out.println("Thread starts!"); try { m1(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { TT tt = new TT(); Thread t = new Thread(tt); t.start(); tt.m2(); System.out.println(tt.b); } }
NewMoons 2016-10-20
  • 打赏
  • 举报
回复
拜托能把代码发上来么?

62,616

社区成员

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

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