Java如何关闭或关闭BlockingQueue?

在此示例中,您将学习如何BlockingQueue在队列中没有其他可用元素时关闭或关闭。我们将通过使生产者在“生产者-消费者”场景中发送标记对象来使用通用策略。此标记对象也称为有毒对象,将被视为队列中不再包含需要处理的对象的标志。这将使我们能够中断使用者线程的操作。

package org.nhooo.example.util.concurrent;

import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.BlockingQueue;

public class BlockingQueueShutdown {

    public static void main(String[] args) {

        BlockingQueue<String> queue = new ArrayBlockingQueue<>(32);

        MyDataProducer producer = new MyDataProducer(queue);

        MyDataConsumer consumer = new MyDataConsumer(queue);

        new Thread(producer).start();

        new Thread(consumer).start();

    }

}

下面是Producer将数据放入队列的对象。字符串DONE是我们的标记对象。这是最后一个数据将被放置在队列中,以供消费者提取。

package org.nhooo.example.util.concurrent;

import java.util.concurrent.BlockingQueue;

public class MyDataProducer implements Runnable {

    BlockingQueue<String> queue;

    public MyDataProducer(BlockingQueue<String> queue) {

        this.queue = queue;

    }

    @Override

    public void run() {

        System.out.println("MyDataProducer.run");

        String[] data = {"D001", "D002", "D003", "D004", "D005", "DONE"};

        try {

            for (String element : data) {

                queue.put(element);

                Thread.sleep(1000);

            }

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

所述Consumer对象循环以从队列中检索的元素。当它从队列中检索标记对象时,它将中断循环并结束线程。

package org.nhooo.example.util.concurrent;

import java.util.concurrent.BlockingQueue;

public class MyDataConsumer implements Runnable {

    BlockingQueue<String> queue;

    public MyDataConsumer(BlockingQueue<String> queue) {

        this.queue = queue;

    }

    @Override

    public void run() {

        System.out.println("MyDataConsumer.run");

        while (true) {

            try {

                String element = queue.take();

                if ("DONE".equals(element)) {

                    System.out.println("Exiting consumer thread, " +

                            "end of data reached.");

                    break;

                }

                System.out.println("Element = " + element);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

                       

以上是 Java如何关闭或关闭BlockingQueue? 的全部内容, 来源链接: utcz.com/z/337938.html

回到顶部