Java BlockingQueue take() против опроса (время, единица измерения)

Я думаю, что по ошибке ребята сравнили take() и poll(), но я обнаружил, что разумно сравнивать take() и poll (время, единицу измерения), так как оба они предоставлены BlockingQueue, и оба они блокируют очередь сообщений, а не Empty, и в случае, если опрос или тайм-аут ", ОК, давайте начнем сравнение, обычно я использую take() для BlockingQueue, но у меня возникли проблемы по поводу:

  1. обработка прерываний внутри цикла.
  2. ожидая, пока вас не прервут снаружи.
  3. как перестать зацикливаться на очереди "используя 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: если сценарий использования требует ожидания вечно, а производитель предоставляет низкочастотные данные, я думаю, лучше выбрать решение.

0 ответов

Другие вопросы по тегам