java的Thread问题,我在线等高手的指教

来源:百度知道 编辑:UC知道 时间:2024/04/27 23:05:10
class Kehou implements Runnable
{
int i=100;
public void run()
{
while(i>0)
{

synchronized(this)
{
System.out.println( Thread.currentThread().getName());
try{Thread.sleep(1);}
catch (InterruptedException e){e.printStackTrace();}
System.out.println(i--);
}
}

}
}

class Test
{
public static void main(String []args)
{
Kehou k=new Kehou ();
new Thread(k).start();
new Thread(k).start();

}
}
运行后得到的是:
Thread-0
6
Thread-1
5
Thread-0
4
Thread-1
3
Thread-0
2
Thread-1
1
Thread-0
0
我认为应该不会出现Thread-0
0
;但怎么会这样,我不是已经把那段代码加琐了吗?
不明白,我是说采用同步块以后,不应该出现0;即i>0;当然输出的值不会是0;

你这样写本身就有问题,同步块只是说当有线程正在运行时其他线程等待,当这个线程做完了,其他线程自然可以运行,你发现你的运行结果是不是都是交替的,
输出线程名字后面接着输出值,如果你把同步块去掉,你会发现结果很混乱
Thread-0
Thread-1
4
3
象这样,这是两个线程同时运行代码造成的,明白了没

看错题目了,不好意思哈

这个原因也很简单,你把 while 包含在 同步块中就行了,为什么会这样呢,因为他们是线程,他们是异步运行的,
当 i 等于 1 时,现成 1 先进入了 synchronized 中,那线程2呢,因为这时的i还是1,没有改变,所以线程2 也通过了 i > 0 的判断,但是由于同步块的原因,他在外等待线程 1 完成,线程1完成后,线程2就进去了,所以 i > 0 的判断就没作用了

如下所示

while(i>0)
{
//线程1 和线程2 同时通过了判断,但现成1 先进去了,现成2在此等待
synchronized(this)
{
线程1执行 System.out.println(i--); 退出,此时 i 为0, 线程1出去后 线程2紧跟着进来了先输出 0 再 i--

把这个方法写成同步方法,变量定义成同步变量。一切OK