私を助けてくれますか?スレッドが特定のイベントが発生するのを待つ方法
私がしようとしているのは、プリンタの例です。より多くのプリンタと印刷待ちのドキュメントがあります。
Printer
は、Thread
です。ドキュメントが到着するまでスリープしてから印刷し、再びスリープ状態になります。
PrinterManager
もスレッドです。キューから文書を収集し、無料のPrinter
に送信します。無料のプリンタを見つけるためにSemaphore
を使用しています。
問題は、wait-notifyペアの周りです。プリンターは、マネージャーが文書を送信するまで待つ必要があります。その後、1秒待って「プリント」します。ロックオブジェクトとしては、stick
を使用します。
何らかの理由で、機能しません。ドキュメントはプリンタに正常に送信されますが、プリンタは起動されません。なぜ、助けてくれますか?
プリンタのスレッド:
public class Printer extends Thread {
private final Semaphore semaphore;
private final Object stick;
private String document;
public Printer(Semaphore semaphore, Object stick) {
this.semaphore = semaphore;
this.stick = stick;
}
public void setDocument(String document) {
this.document = document;
}
@Override
public void run() {
while (true) {
try {
stick.wait();
Thread.sleep(1000);
System.out.println("Printing: " + document);
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
マネージャスレッド:(?あなたが実験を行います)
public class PrinterManager extends Thread {
private final Printer[] printers = new Printer[1];
private final Object stick = new Object();
private final Semaphore semaphore = new Semaphore(printers.length);
private final DocumentQueue queue;
public PrinterManager(DocumentQueue queue) {
this.queue = queue;
printers[0] = new Printer(semaphore, stick);
}
@Override
public void run() {
while (true) {
try {
semaphore.acquire();
String toPrint = takeNextDocument();
printers[0].setDocument(toPrint);
synchronized (stick) {
stick.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private String takeNextDocument() throws InterruptedException {
return queue.take();
}
}
スティックではなくプリンタに通知してください。 – 5tingr4y
いいえ、それは 'IllegalMonitorStateException'を引き起こします。 –
正しくリコールすれば、' stick'でも 'wait()'コールを同期させる必要があります –