等到线程结束
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,但我希望在 food
、producer
和 consumer
的线程 运行 完成之后。我该怎么做?
您可以使用 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();
}
}
主要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,但我希望在 food
、producer
和 consumer
的线程 运行 完成之后。我该怎么做?
您可以使用 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();
}
}