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();
}
}
}
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();
}
}
}
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.c线程执行完之后,主线程才执行到c.wait();此时程序会顺利执行,出现第一个结果。
1. 是在执行完c.wait();线程C启动,出现第一个结果。
2. 在c.wait()之前,线程C启动,出现第二个结果,此时线程C会被c.wait()挂起。
2.c线程执行完之后,主线程才执行到c.wait();此时程序会顺利执行,出现第一个结果。
c线程is running..
sum is362880
waiting for b1 to complete....
上面是本机运行某次结果,C线程不一定能执行完,因为主线程里面使用了C的锁,这就看两个线程谁先执行到同步锁那里,如果是主线程那就卡主了。