我是Java編程新手。我想用wait()和notify()來運行兩個線程。但我不能使用線程同步,睡眠,良率或等待(參數)任務標誌。我寫了它,但我不得不使用睡眠。有人可以幫助我改變它沒有睡眠。 這是我的主類Java - 兩個線程wait()和notify()
public class mainClass{
public static void main(String args[]) throws InterruptedException {
final Processor processor = new Processor();
for(int i=0; i<100; i++){
final int z = i;
Thread trainer = new Thread(new Runnable(){
public void run(){
try{
processor.produce(z);
}catch(InterruptedException e){
e.printStackTrace();
}
}
});
Thread sportsman = new Thread(new Runnable(){
public void run(){
try{
processor.consume(z);
}catch(InterruptedException e){
e.printStackTrace();
}
}
});
trainer.start();
sportsman.start();
trainer.join();
sportsman.join();
}
System.out.println("100 Tasks are Finished.");
}
}
這是我的第二個類。
public class Processor {
public void produce(int n) throws InterruptedException {
synchronized (this){
System.out.println("Trainer making " + (n+1) + " Task...");
wait();
System.out.println("");
}
}
public void consume(int m) throws InterruptedException {
Thread.sleep(1);
//I want to run the code without using sleep and get same output
synchronized (this){
System.out.println("Sportman doing " + (m+1) + " Task...");
notify();
}
}
}
這是我的輸出。
Trainer making 1 Task...
Sportman doing 1 Task...
Trainer making 2 Task...
Sportman doing 2 Task...
.
.
.
Trainer making 99 Task...
Sportman doing 99 Task...
Trainer making 100 Task...
Sportman doing 100 Task...
100 Tasks are Finished.
謝謝。我的英語不好。對不起。
如果您沒有等待的線程通知它會丟失。在進行狀態更改後需要通知,那麼您需要在wait()的循環中檢查狀態更改,因爲它可能會虛假地喚醒。 –
這裏記錄了正確使用'wait()'和'notify()'。 https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html –
你想要/期望輸出看起來像什麼? –