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

© 学习代码 中级黑马   /  2014-3-26 10:27  /  1082 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Demo
  2. {        int num = 0;
  3.                 //Object obj = new Object();
  4.                 public synchronized void show(int a)
  5.                 {       
  6.                         num = num+a;
  7.                         //try{Thread.sleep(10);}catch(Exception e){}//这里不加这句话,结果也是一样的,这句话为什么要加在上面呢
  8.                         System.out.println(num);
  9.                 }
  10.        
  11. }
  12. class Person implements Runnable
  13. {
  14.         private Demo d = new Demo();
  15.         public void run()
  16.         {
  17.                 for(int x= 0 ;x<3;x++)
  18.                 {       
  19.                         d.show(100);
  20.                 }
  21.         }
  22. }


  23. class Demo1
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Person p = new Person();
  28.                 Thread t1 = new Thread(p);
  29.                 Thread t2 = new Thread(p);
  30.                 t1.start();
  31.                 t2.start();
  32.         }
  33. }
复制代码

大侠  帮忙解释一下

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

5 个回复

倒序浏览
try{Thread.sleep(10);}catch(Exception e){}意思是在调用Thread的sleep()方法,让线程休眠10毫秒。你去掉public synchronized void show(int a)方法中的synchronized再试试。最好让线程休眠的时间稍微长一点,更容易观察现象
回复 使用道具 举报
你的循环里只执行了3次,对于cpu来说完全可以在一个时间片内执行完,所以无法测试多线程。要想看到多线程的现象,必须是启动一个线程1执行,并且在cpu一个时间片内执行不完,这是切换到另一个线程2,执行完线程2的时间片后,切换到线程1。加上sleep()语句就是延长线程的执行时间,让他大于时间片。 如果不加的话,就相当于两个线程顺序执行。
回复 使用道具 举报
10毫秒太短时间,观察不出来现象,改成10000就出来了现象了
回复 使用道具 举报
这是为了让线程进入休眠状态,可能在代码效果体现不是很明显,但是运行的流程就是不一样了,当线程执行到try{Thread.sleep(10);}catch(Exception e){}的时候,就要休眠10毫秒。
回复 使用道具 举报
对于我们来说是一样的,因为10毫秒让我们没有感觉,就好想觉得没有什么变化一样,这里将睡眠的时间搞到10000试试你就知道是不一样的了
但是对于计算机来说就不一样了,因为计算机进程之间的切换远远比10毫秒还要小,所以在该线程sleep(10)这期间,cpu其实早已在各个线程之间切换了好多次了,只是睡眠的进程没有释放同步锁,所以其他进程就无法进入该同步函数,等到10毫秒过后,该线程被唤醒,执行println语句,打印结果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马