黑马程序员技术交流社区

标题: 多线程输出结果不明白 [打印本页]

作者: dangfei    时间: 2012-2-23 09:35
标题: 多线程输出结果不明白
public static void main(String[] args) {
                // TODO Auto-generated method stub
            new testThread("线程1").start();
            new testThread("线程2").start();
            new testThread("线程3").start();
        }

}

class  testThread extends Thread{
        public synchronized  void run() {
                //notify();
                int a=0;
                try {
                        while(a<8)
                        {
                            
                                //notifyAll();
                                System.out.println(getName()+"|"+a);
                                sleep(1000);
                                a++;
                                for(int i=1;i<=10;i++)
                                        System.out.println(getName()+"|!"+i);
                        }
                       
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }               
        }
        public testThread(String name)
        {
                super(name);
        }

synchronized保证方法在同一时间只有一个线程执行,但上面代码结果中,for循环输出结果为什么不连续。
猜想原因可能是sleep(1000);。但是如果在synchronized内部用sleep(),线程睡醒后就不管synchronized了,sleep()岂不是破坏了synchronized。
作者: 刘基军    时间: 2012-2-23 10:00
  1. class  testThread extends Thread{

  2.         public void run() {
  3.                 synchronized(testThread.class) //修改为同步下面的代码。我好像没见过同步run()方法的做法,呵呵,还有待研究
  4.                 {
  5.                 //notify();
  6.                 int a=0;
  7.                 try {
  8.                         while(a<8)
  9.                         {
  10.                            
  11.                                 //notifyAll();
  12.                                 System.out.println(getName()+"|"+a);
  13.                                 sleep(1000);
  14.                                 a++;
  15.                                 for(int i=1;i<=10;i++)
  16.                                         System.out.println(getName()+"|!"+i);
  17.                         }
  18.                         
  19.                 } catch (Exception e) {
  20.                         // TODO Auto-generated catch block
  21.                         e.printStackTrace();
  22.                 }      
  23.               }         
  24.         }
  25.         public testThread(String name)
  26.         {
  27.                 super(name);
  28.         }

  29. }
复制代码

作者: 林铁柱    时间: 2012-2-23 10:37
同步函数的锁是this,三个线程就拥有三个各自的this,所以楼主的代码并没有实现同步,当然打印结果不能连续输出。这个时候使用代码块,将锁设为testThread.class或者主函数的class即可,总之要保证锁的唯一性。




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