Condition
を使用して、条件がガードスレッドの指定された期間に満たされるのを待つことができます。条件が長すぎる場合、ガードスレッドはInterruptedException
を受信します。
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
private static class PotentiallyBlockingTask implements Runnable {
private final Lock lock;
private final Condition condition;
public PotentiallyBlockingTask(Lock lock, Condition condition) {
this.lock = Objects.requireNonNull(lock);
this.condition = Objects.requireNonNull(condition);
}
@Override
public void run() {
// run the task
// signal the guard thread that it is done.
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
}
}
private static class GuardTask implements Runnable {
private final Lock lock;
private final Condition condition;
public GuardTask(Lock lock, Condition condition) {
this.lock = Objects.requireNonNull(lock);
this.condition = Objects.requireNonNull(condition);
}
public void run() {
lock.lock();
try {
condition.await(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// handle situation
} finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
PotentiallyBlockingTask pbt = new PotentiallyBlockingTask(lock, condition);
GuardTask gt = new GuardTask(lock, condition);
//....
}
}
*時にはこのプログラムがブロックされ、私はそれを止める必要があります*:まあ、最初は起こらないはずです。あなたのバグを回避しようとしないでください。代わりにそれらを修正してください。しかし、あなたは一行のコードを投稿していないので、私たちは助けることはできません。 –