黑马程序员技术交流社区

标题: 求大神们帮我看看这个线程问题! [打印本页]

作者: 要你快乐    时间: 2014-5-18 17:14
标题: 求大神们帮我看看这个线程问题!
本帖最后由 要你快乐 于 2014-5-18 19:15 编辑
  1. public class BianLiangDemo implements Runnable{
  2.         int b=100;
  3.         public synchronized void m1()throws Exception{
  4.                 //Thread.sleep(5000);
  5.                 b=1000;
  6.                 System.out.println("m1 b="+b);
  7.         }
  8.         public synchronized void m2() throws Exception{
  9.                 Thread.sleep(2500);
  10.                 b=2000;
  11.                 System.out.println("m2 b="+b);
  12.         }
  13.         public void run(){
  14.                 try{
  15.                         m1();
  16.                 }catch(Exception e){e.printStackTrace();}
  17.         }
  18.         public static void main(String[] args)throws Exception  {
  19.                 BianLiangDemo t=new BianLiangDemo();
  20.                 Thread t1=new Thread(t);
  21.                 t1.start();
  22.                 t.m2();
  23.                 System.out.println("t="+t.b);
  24.         }
  25. }
复制代码

为什么输出结果是:m2 b=2000t=2000
m1 b=1000
而不是:m1 b=1000
m2 b=2000t=2000呢?


作者: ↘ふ紫铯幽夢    时间: 2014-5-27 18:18
因为主函数有一个线程在跑,而执行到t1.start()时,有另外开了一个线程,这时主线程继续往下跑,执行到t.m2().建议多执行几次,看看结果会不会变化。。。。。。。。。
作者: 要你快乐    时间: 2014-5-28 10:02
↘ふ紫铯幽夢 发表于 2014-5-27 18:18
因为主函数有一个线程在跑,而执行到t1.start()时,有另外开了一个线程,这时主线程继续往下跑,执行到t.m2 ...

不是这个原因,试过n次。。。
作者: ↘ふ紫铯幽夢    时间: 2014-5-28 10:18
本帖最后由 ↘ふ紫铯幽夢 于 2014-5-28 10:21 编辑
要你快乐 发表于 2014-5-28 10:02
不是这个原因,试过n次。。。


那你在t1.start() 后面加一句 Thread.sleep(500)试试。。。。。我在网吧没有环境。。。
作者: 812133278@qq.co    时间: 2014-5-28 10:41
…………




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2