通知想象,一個法師被要求5個指南,以幫助5個孩子打印的線路有n個文件。學校裏只有一臺打印機。現在,100多行的孩子應該等待其他孩子完成打印。我寫了下面的代碼如何使一個線程等待,並在Java
public enum Printer {
printer;
public synchronized void print(Kid kid) {
if(kid.getPagesToPrint()<100){
System.out.println(kid.getName()+" is printing "+kid.getPagesToPrint()+" pages");
notify();
}else{
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
的孩子類
public class Kid {
private String name;
private int pagesToPrint;
public Kid(String name, int pagesToPrint) {
super();
this.name = name;
this.pagesToPrint = pagesToPrint;
}
public int getPagesToPrint() {
return pagesToPrint;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setPagesToPrint(int pagesToPrint) {
this.pagesToPrint = pagesToPrint;
}
}
的GuideThread類
public class GuideThread implements Runnable {
private Kid kid;
public GuideThread(Kid kid) {
super();
this.kid = kid;
}
@Override
public void run() {
Printer.printer.print(kid);
}
}
最後的大師班 公共類碩士{
public static void main(String[] args) {
for(int i=1;i<6;i++){
Thread t = new Thread(new GuideThread(new Kid("Kid_"+i,i*23)));
t.start();
}
}
}
當我執行它,該程序正在等待幾分鐘,然後terminates.Can有人糾正這個代碼,以便通知所有正在等待 的線程,然後再打印所有少於第一個頁面的頁面。
的輸出如下Kid_3是印刷 69頁Kid_2是印刷 46頁Kid_1是印刷 23頁Kid_4正在打印92頁 –
你的等待條件是錯誤的:有100多頁的孩子只能等待,如果另一孩子少於100歲。否則,孩子將永遠等待。同樣,等待(應該總是在循環內部)在你的代碼中,如果一個孩子等待並被通知,它不會結束打印:print()方法在等待wait()和notify()之後返回是你應該在這裏使用PriorityBlockingQueue首先打印小文檔,最後一個打印小文檔 –
這是可能的,只有通過使用PriorityBlockingQueue ..我們不可以使用wait/notify/notifyAll方法嗎? –