当前位置: 代码迷 >> 多核软件开发 >> 线程同步有关问题,分析上程序运行结果
  详细解决方案

线程同步有关问题,分析上程序运行结果

热度:2830   发布时间:2013-02-26 00:00:00.0
线程同步问题,分析下程序运行结果
package test;

public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
Threadc c = new Threadc();
c.setName("c线程");
b.setName("b线程");
c.start();
System.out.println(Thread.currentThread().getName()+"is start....");
synchronized(c){
try{
System.out.println("waiting for b1 to complete....");
c.wait();
System.out.println("Completed.now back to"+Thread.currentThread().getName());
b.start();
}catch(InterruptedException e){

}
}
}
}
class ThreadB extends Thread{
int total;
public void run(){
synchronized(this){
System.out.println(Thread.currentThread().getName()+"is running..");
for(int i=0;i<10;i++){
total +=i;
}
System.out.println("total is"+total);
}
}
}
class Threadc extends Thread{
int sum=1;
public void run(){
synchronized(this){
System.out.println(Thread.currentThread().getName()+"is running..");
for(int i=1;i<10;i++){
sum *=i;
}
System.out.println("sum is"+sum);
notify();
}
}
}

------解决方案--------------------------------------------------------
探讨

1.执行c线程过程中,主线程执行到c.wait();就会导致整个程序挂起一直等待被唤醒。然后出现第二个结果。
2.c线程执行完之后,主线程才执行到c.wait();此时程序会顺利执行,出现第一个结果。

------解决方案--------------------------------------------------------
这两种结果产生的原因是以对象c为同步对象的两段代码块,谁先运行的问题。

第一种情况,主线程优先运行到synchonized(c)标记的同步代码块,这时c线程synchronized(this)标记的代码块就暂时无法运行。主线程运行到c.wait()时,主线程释放同步对象的锁,进入阻塞状态,c线程会由阻塞状态变为运行状态。c线程运行完后,通过其 notify(),使主线程由阻塞状态进入运行状态,正常执行完毕。

第二种情况,c线程优先运行到synchronized(this)标记的代码块,这时主线程因为得不到同步对象锁而阻塞。当c线程运行结束后,释放同步对象锁,这时主线程由阻塞进入运行状态,当运行到c.wait()时,进入阻塞状态,因没有程序运行notify(),所以一直阻塞下去了。
------解决方案--------------------------------------------------------
探讨

这2种答案都是waiting for b1 to complete....在C线程执行完后,才打印出来的。说明这2种答案,都是主线程在C线程运行完后才执行的。那你们的回复还是不对呀。
  相关解决方案