A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 要你快乐 中级黑马   /  2014-5-18 17:14  /  1163 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 要你快乐 于 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呢?

4 个回复

倒序浏览

回帖奖励 +1

因为主函数有一个线程在跑,而执行到t1.start()时,有另外开了一个线程,这时主线程继续往下跑,执行到t.m2().建议多执行几次,看看结果会不会变化。。。。。。。。。
回复 使用道具 举报
↘ふ紫铯幽夢 发表于 2014-5-27 18:18
因为主函数有一个线程在跑,而执行到t1.start()时,有另外开了一个线程,这时主线程继续往下跑,执行到t.m2 ...

不是这个原因,试过n次。。。
回复 使用道具 举报
本帖最后由 ↘ふ紫铯幽夢 于 2014-5-28 10:21 编辑
要你快乐 发表于 2014-5-28 10:02
不是这个原因,试过n次。。。


那你在t1.start() 后面加一句 Thread.sleep(500)试试。。。。。我在网吧没有环境。。。
回复 使用道具 举报
…………
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马