等到螺纹完成

时间:2015-04-14 09:41:31

标签: java multithreading thread-safety multiprocessing

主类:

producer p = new producer();
food me = new food();
me.eat(times,p);
....>Rest of Code<.......

其他课程:

class food {

    public int times;
    public int food;
    public boolean canget=false;
    boolean done=false;



   void eat(int times,producer p){

       this.times = times;
       p.produce(this);
       consumer pe = new consumer();
       pe.consume(this);


   }

    synchronized void add(int n){
        while(canget) {
            try {
                wait();
            } catch (Exception e) {
                System.out.println("Something nasty happened");
            }
        }

        this.food = n;
        System.out.println("Produced food '"+n+"'");
        canget = true;
        notify();
    }
    synchronized int get(){
        while (!canget){
            try{
                wait();
            }catch (Exception e) {
                System.out.println("Something Nasty happened");
            }
        }
        canget = false;
        notify();
        System.out.println("Eaten food '"+this.food+"'");
        return this.food;
    }

}

class producer implements Runnable{
    int times;
    food f;
    boolean done;

    boolean done(Thread t) {
        return done;
    }

    void produce(food F){
        times=F.times;
        f=F;
        Thread t = new Thread(this);
        t.start();



        }


    public void run() {
        while(this.times-- > 0){
            f.add(times);

        }

    }
}

class consumer implements Runnable{

    int times;
    food f;

    void consume(food F){
        times=F.times;
        f=F;
        Thread t = new Thread(this);
        t.start();
    }

    public void run() {
        while(this.times-- > 0){
            f.get();
        }
    }
}

在此声明之后:

me.eat(times,p);

其余的代码正在运行,但我希望在foodproducerconsumer运行的线程完成之后。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您可以使用CountDownLatch让生产者和消费者在完成后发出信号,并在主代码中等待该信号。

主要代码:

int times = 3;

CountDownLatch completion = new CountDownLatch(2);

producer p = new producer(completion);
food me = new food(completion);
me.eat(times, p);


try {
    completion.await();
} catch (InterruptedException e) {
    e.printStackTrace();
}

System.out.println("Done");

更新了课程:

class food {

    public int times;
    public int food;
    public boolean canget = false;
    private CountDownLatch completion;

    public food(CountDownLatch completion) {
        this.completion = completion;
    }

    void eat(int times, producer p) {
        this.times = times;
        p.produce(this);
        consumer pe = new consumer(completion);
        pe.consume(this);
    }

    synchronized void add(int n) {
        while (canget) {
            try {
                wait();
            } catch (Exception e) {
                System.out.println("Something nasty happened");
            }
        }

        this.food = n;
        System.out.println("Produced food '" + n + "'");
        canget = true;
        notify();
    }

    synchronized int get() {
        while (!canget) {
            try {
                wait();
            } catch (Exception e) {
                System.out.println("Something Nasty happened");
            }
        }
        canget = false;
        notify();
        System.out.println("Eaten food '" + this.food + "'");
        return this.food;
    }

}

class producer implements Runnable {
    int times;
    food f;
    boolean done;
    private CountDownLatch completion;

    public producer(CountDownLatch completion) {
        this.completion = completion;
    }

    void produce(food F) {
        times = F.times;
        f = F;
        Thread t = new Thread(this);
        t.start();
    }


    public void run() {
        while (this.times-- > 0) {
            f.add(times);
        }
        completion.countDown();
    }
}

class consumer implements Runnable {

    int times;
    food f;
    private CountDownLatch completion;

    public consumer(CountDownLatch completion) {
        this.completion = completion;
    }

    void consume(food F) {
        times = F.times;
        f = F;
        Thread t = new Thread(this);
        t.start();
    }

    public void run() {
        while (this.times-- > 0) {
            f.get();
        }
        completion.countDown();
    }
}