线程题目,会的回答
答了的朋友,请附上详细解说。谢谢!线程A和线程B分别在屏幕上显示信息“……start”后,调用wait等待;线程c开始后调用sleep休眠一段时间,然后调用notifyall,使
线程A和线程B继续运行。线程A和线程B恢复运行后输出信息“……end”后结束,线程c在判断线程B和线程A结束后,自己也结束运行。
请附上详细解说。谢谢!
public class Hello { public static void main(String[] args) { Object lock = new Object(); A a = new A(lock); B b = new B(lock); C c = new C(a,b,lock); a.start(); b.start(); c.start(); boolean b1=false,b2=false,b3=false;//b1代表a线程是否结束,b2代表b线程是否结束,b3代表c线程是否结束 while(true){ if(!a.isAlive()&&!b1){ System.out.println("a is closed"); b1=true; } if(!b.isAlive()&&!b2){ System.out.println("b is closed"); b2=true; } if(!c.isAlive()&&!b3){ System.out.println("c is closed"); b3=true; } if(b1&&b2&&b3) break; } } } class A extends Thread{ Object lock = null; //从构造函数中传入3个线程竞争的锁 public A(Object lock){ this.lock = lock; } public void run(){ synchronized (lock) { System.out.println(".................A start"); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(".................A end"); } } } class B extends Thread{ Object lock = null; public B(Object lock){ this.lock = lock; } public void run(){ synchronized (lock) { System.out.println(".................B start"); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(".................B end"); } } } class C extends Thread{ A a; B b; Object lock = null; //从构造函数中传入3个线程竞争的锁,并传入a,b线程 public C(A a, B b, Object lock){ this.a=a; this.b=b; this.lock = lock; } public void run(){ try { sleep(3*1000); //线程休眠3秒钟 synchronized (lock) { lock.notifyAll(); //释放所有在等待中的锁,并且被释放的所有锁公平竞争取得锁 } while(a.isAlive()||b.isAlive());//如果a,b线程没有结束,则c不能结束。 //this.interrupt();//线程运行完会自动结束,不需要自己去中断。 } catch (InterruptedException e) { e.printStackTrace(); } } }