定期的に何らかのタスクを実行するRunnableクラスを作成しました。このクラスには、指定された時間が経過したかどうかに関係なく、タスクを破棄して即時に実行するメソッドがあります。
クラスは指定された時間に定期的なタスクを実行しますが、トリガーは期待どおりに機能しません。
以下は、main メソッドを使用した簡略化されたクラス コードです。私の解釈のAPIドキュメントによるとtrigger
、呼び出されたときに通知され、指定された時間の経過を待たずにawait
多かれ少なかれすぐにタスクが実行されるように戻る必要があります。
Java のロックと条件のどこが間違っていますか? trigger
メソッドが期待どおりに動作しない理由がわかりませんでした。
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.*;
public class PeriodicRunner implements Runnable {
private Lock lock = new ReentrantLock();
private Condition cond = lock.newCondition();
public void trigger() {
lock.lock();
try {
cond.signalAll();
}
finally {
lock.unlock();
}
}
@Override
public void run() {
lock.lock();
try {
while(true) {
cond.await(5, TimeUnit.SECONDS);
System.out.println("some task here");
}
}
catch(InterruptedException ex) {
}
finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
PeriodicRunner pr = new PeriodicRunner();
new Thread(pr).start();
pr.trigger();
}
}