当前位置: 代码迷 >> Java相关 >> 线程题目,会的回答
  详细解决方案

线程题目,会的回答

热度:189   发布时间:2010-05-26 23:13:49.0
线程题目,会的回答
答了的朋友,请附上详细解说。谢谢!

线程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();         
        }
    }
}

----------------解决方案--------------------------------------------------------
谢谢!
----------------解决方案--------------------------------------------------------
回复 4楼 linjx0123
我用C语言写一个线程,想计算整个工程的代码从开始到结束用了多少时间,用clock()函数得到开始时间,应该把该函数放在哪里。谢谢。怎么停止六个线程。
或许我写的不清晰。谢谢。
----------------解决方案--------------------------------------------------------
  相关解决方案