等到线程结束

Wait till thread finishes

主要Class:

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);

其余代码是 运行ning,但我希望在 foodproducerconsumer 的线程 运行 完成之后。我该怎么做?

您可以使用 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();
    }
}