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.   

    main is start....
    c线程 is running..
    sum is 362880
    waiting for b1 to complete....
    Completed.now back tomain
    b线程 is running..
    total is 45
    其中一个运行结果是这样的,高手讲解下,还有一种结果是:
    main is start....
    c线程 is running..
    sum is 362880
    waiting for b1 to complete....
      

  2.   

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

  3.   

    错了,
    1. 是在执行完c.wait();线程C启动,出现第一个结果。
    2. 在c.wait()之前,线程C启动,出现第二个结果,此时线程C会被c.wait()挂起。
      

  4.   

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

  5.   

    这两种结果产生的原因是以对象c为同步对象的两段代码块,谁先运行的问题。第一种情况,主线程优先运行到synchonized(c)标记的同步代码块,这时c线程synchronized(this)标记的代码块就暂时无法运行。主线程运行到c.wait()时,主线程释放同步对象的锁,进入阻塞状态,c线程会由阻塞状态变为运行状态。c线程运行完后,通过其 notify(),使主线程由阻塞状态进入运行状态,正常执行完毕。第二种情况,c线程优先运行到synchronized(this)标记的代码块,这时主线程因为得不到同步对象锁而阻塞。当c线程运行结束后,释放同步对象锁,这时主线程由阻塞进入运行状态,当运行到c.wait()时,进入阻塞状态,因没有程序运行notify(),所以一直阻塞下去了。
      

  6.   

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

  7.   

    main is start....
    c线程is running..
    sum is362880
    waiting for b1 to complete....
    上面是本机运行某次结果,C线程不一定能执行完,因为主线程里面使用了C的锁,这就看两个线程谁先执行到同步锁那里,如果是主线程那就卡主了。