| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 859 人关注过本帖
标题:线程同步的小问题,是不是永远无法预知?
只看楼主 加入收藏
dousao
Rank: 2
等 级:论坛游民
帖 子:228
专家分:58
注 册:2007-11-8
结帖率:75%
收藏
 问题点数:0 回复次数:4 
线程同步的小问题,是不是永远无法预知?
public class TT implements Runnable {  
     int b = 100;  
      
     public synchronized void m1() throws Exception{  
           
         b = 1000;  
         Thread.sleep(5000);  
         System.out.println("b = " + b);  
     }  
      
     public synchronized void m2() throws Exception {  
         Thread.sleep(2500);  
         b = 2000;  
     }  
      
     public void run() {  
         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);  
     }  
 }


是不是永远无法预知先执行主线程还是t线程? 当主线程执行调用m2时候m2睡眠不是把cpu让给了t线程了么?让来让去的也不清楚到底怎么让了,希望牛人解释先。
搜索更多相关主题的帖子: 线程 预知 
2008-09-16 18:42
dousao
Rank: 2
等 级:论坛游民
帖 子:228
专家分:58
注 册:2007-11-8
收藏
得分:0 
我的理解是这样的:

假设t线程先被分配执行,b=1000后,睡眠5000,机会让给主线程中的m2方法,m2睡眠2500,把锁给t线程,但是t线程还是在睡眠没法执行,只有等2500结束,主线程继续执行,b=2000,输出tt.b,即输出了2000,这个时候t线程终于有时间执行,接着从 Thread.sleep(5000);下面继续执行输出 b=2000


假设主线程先被分配执行,即执行m2,睡眠2500,让给t线程,b=1000,睡眠让给主线程m2,b=2000,t线程继续睡着,没法执行,所以主线程执行完,输出2000,然后t线程执行 输出b=2000

但是结果并非如此。我的理解哪里出问题了?
2008-09-16 18:57
dousao
Rank: 2
等 级:论坛游民
帖 子:228
专家分:58
注 册:2007-11-8
收藏
得分:0 
妈的,小破题目,难道难住众位好汉?
2008-09-17 00:13
oldmtn
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-9-22
收藏
得分:0 
你小子,再想想
2008-09-22 23:38
fvplayboy
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-9-21
收藏
得分:0 
``哎 `
真你M匪夷所思````我也整 不明白 ``我得出的结论是 2000    b=2000 高手指点指点啊``
2008-09-23 21:08
快速回复:线程同步的小问题,是不是永远无法预知?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014219 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved