Java BlockingQueue take() против опроса (время, единица измерения)
Я думаю, что по ошибке ребята сравнили take() и poll(), но я обнаружил, что разумно сравнивать take() и poll (время, единицу измерения), так как оба они предоставлены BlockingQueue, и оба они блокируют очередь сообщений, а не Empty, и в случае, если опрос или тайм-аут ", ОК, давайте начнем сравнение, обычно я использую take() для BlockingQueue, но у меня возникли проблемы по поводу:
- обработка прерываний внутри цикла.
- ожидая, пока вас не прервут снаружи.
- как перестать зацикливаться на очереди "используя Kill-Bill или прерывание потока"
особенно при работе с потоками Java 8, я понял, что мне нужно прекратить извлекать данные из очереди и закрыть их лучше, поэтому я решил подождать некоторое время, после чего я могу прекратить извлекать данные, а затем обнаружил опрос (время, блок), и это будет соответствовать этой идее, проверьте код ниже:
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Integer> q = new LinkedBlockingQueue<Integer>();
ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(() -> {
IntStream.range(0, 1000).boxed().forEach(i -> {
try {
q.put(i);
} catch (InterruptedException e) {
currentThread().interrupt();
throw new RuntimeException(e);
}
});
});
....
// Take
Future fTake = executor.submit(() -> {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println(q.take());
}
} catch (InterruptedException e) {
currentThread().interrupt();
throw new RuntimeException(e);
}
});
//to stop it I have to do below code "Expecting that execution will take 1 sec"
executor.shutdown();
sleep(1000);
fTake.cancel(true);
....
// poll there is no need to expect time till processing will be done
Future fPoll = executor.submit(() -> {
try {
Integer i;
while ((i = q.poll(100, TimeUnit.MILLISECONDS)) != null)
System.out.println(i);
} catch (InterruptedException e) {
currentThread().interrupt();
throw new RuntimeException(e);
}
});
executor.shutdown();
}
Я думаю, что код опроса более чистый и нет необходимости зависеть от прерывания, а также нет необходимости оценивать время выполнения или определять код, чтобы определить, когда прерывать поток, как вы думаете?
Примечание 1: Я уверен, что у второго решения также есть недостатки, такие как нехватка данных до истечения времени ожидания, но я думаю, что вы узнаете, какое время ожидания подходит для вашего случая.
Примечание 2: если сценарий использования требует ожидания вечно, а производитель предоставляет низкочастотные данные, я думаю, лучше выбрать решение.