黑马程序员技术交流社区
标题:
多线程输出结果不明白
[打印本页]
作者:
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
class testThread extends Thread{
public void run() {
synchronized(testThread.class) //修改为同步下面的代码。我好像没见过同步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);
}
}
复制代码
作者:
林铁柱
时间:
2012-2-23 10:37
同步函数的锁是this,三个线程就拥有三个各自的this,所以楼主的代码并没有实现同步,当然打印结果不能连续输出。这个时候使用代码块,将锁设为testThread.class或者主函数的class即可,总之要保证锁的唯一性。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2