У меня есть ситуация, когда у меня есть 2 очереди блокировки. Сначала я вставляю некоторые выполняемые мной задачи. Когда каждая задача завершается, она добавляет задачу во вторую очередь, где они выполняются.Блокировка Java BlockingQueue на take(), с небольшим завихрением
Так что моя первая очередь легко: я просто проверить, чтобы убедиться, что он не пустой и выполнять, иначе я прерываю():
public void run() {
try {
if (taskQueue1.isEmpty()) {
SomeTask task = taskQueue1.poll();
doTask(task);
taskQueue2.add(task);
}
else {
Thread.currentThread().interrupt();
}
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
}
Второй я делаю следующее, что, как вы можете сказать, не работает:
public void run() {
try {
SomeTask2 task2 = taskQueue2.take();
doTask(task2);
}
catch (InterruptedException ex) {
}
Thread.currentThread().interrupt();
}
Как бы вы ее решить, так что второй BlockingQueue не блокирует на дубле(), но заканчивается только тогда, когда он знает, что нет больше элементов, которые будут добавлены. Было бы хорошо, если бы 2-й поток мог видеть 1-ю блокирующую очередь, возможно, и проверить, было ли это пусто, а вторая очередь была пуста, а затем она прерывалась.
Я мог бы также использовать объект Poison, но предпочел бы что-то другое.
NB: Это не точный код, как раз то, что я написал здесь:
Я не могу понять, что вы здесь делаете. Пожалуйста, объясни. –