黑马程序员技术交流社区

标题: 线程不稳定问题 求大神 [打印本页]

作者: 914360849    时间: 2015-6-27 00:27
标题: 线程不稳定问题 求大神
  1. //定义两个线程,每隔300毫秒输出线程的名字,共输出20次
  2. class ThreadTest02 {
  3.         public static void main(String[] args) {
  4.                 // 建立MyThread 对象
  5.                 MyThread2 t1 = new MyThread2();
  6.                 MyThread2 t2 = new MyThread2();

  7.                 // 为线程设置名字
  8.                 t1.setName("我线程1");
  9.                 t2.setName("线程2");

  10.                 // 调用Thread类的start方法,启动线程
  11.                 t1.start();
  12.                 t2.start();
  13.                 // System.out.println("Hello World!");
  14.         }
  15. }

  16. class MyThread2 extends Thread {
  17.         static int i = 0;// 定义计数变量

  18.         public void run() {
  19.                 while (true) {
  20.                         synchronized (this){//。 MyThread2.class替换this打印6次
  21.                        
  22.                                 if (i < 6) {
  23.                                         try {
  24.                                                 Thread.sleep(300);
  25.                                         } catch (InterruptedException e) {
  26.                                                 e.printStackTrace();
  27.                                         }
  28.                                         sop("name:" + Thread.currentThread().getName());
  29.                                         i++;<div class="blockcode"><blockquote>
复制代码


            sop("i="+i);
                                }
                        }
                }
        }

        // 屏幕输出方法
        public static void sop(Object obj) {
                System.out.println(obj);
        }

}
输出结果:
name:线程2
name:我线程1
i=1
i=2
name:线程2
i=3
name:我线程1
i=4
name:线程2
i=5
name:我线程1
i=6
另一种输出结果:
name:我线程1
name:线程2
i=1
i=2
name:我线程1
name:线程2
i=3
i=4
name:我线程1
name:线程2
i=5
i=6
为什么出现这种情况;把synchronized中的this换为MyThread2.class为啥就正常了。

作者: 蓦然回首3Y    时间: 2015-6-27 07:04
也想学习下
作者: 懒锋2015    时间: 2015-6-28 10:03
呃,你这个问题很好解答:this是当前对象的引用,你用this并没有起到锁的作用,因为每个线程都有自己的对象,就有了多个锁;而.class是是这个类在方法区的字节码,是唯一的。
我不知道你是不是在试着解决那个技术分活动的问题,如果是的话,我说两句:毕老师的基础视频里没有提到多线程在监听时间这方面的东西,我去网上搜了相关的东西,解决起来不太简单的。这里有个逻辑:如果多个线程同时运行,每隔一定时间输出当前线程的名字。那么,输出当前线程的名字的命令必然是在当前运行线程中的。而时间这个条件,是客观的,是需要监听判断的。用sleep命令只是缓和下时间,但是破坏了系统在自己运行时自由切换线程的条件。
我们现在学的都是非常基础的东西,要把Java弄深弄懂不是看个几十天的视频和上几十天课就可以的,也因此,有些问题一旦研究深了就尴尬了。当然,我觉得黑马让我们有点Java基础是在培养思维,可以方便学后面的东西的,不一定要非常精深。
作者: JJJD    时间: 2015-6-28 10:19
学习啦。。。
作者: 914360849    时间: 2015-6-28 21:00
懒锋2015 发表于 2015-6-28 10:03
呃,你这个问题很好解答:this是当前对象的引用,你用this并没有起到锁的作用,因为每个线程都有自己的对象 ...

谢谢  大神,
这个 是自测的时候 出来的 ,  感觉以前的多线程全乱了,不知道咋回事
作者: 黑马无敌    时间: 2015-6-28 21:04
学习学习。。。。
作者: zlpiano    时间: 2015-6-28 21:29
来学习下




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