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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 914360849 中级黑马   /  2015-6-27 00:27  /  302 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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为啥就正常了。

6 个回复

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

谢谢  大神,
这个 是自测的时候 出来的 ,  感觉以前的多线程全乱了,不知道咋回事
回复 使用道具 举报
学习学习。。。。
回复 使用道具 举报
来学习下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马