gpt4 book ai didi

Java 生产者消费者 - 为什么不是一个简单的固定线程池?

转载 作者:行者123 更新时间:2023-12-02 04:14:30 25 4
gpt4 key购买 nike

我正在阅读一些有关 Java 中生产者消费者实现的内容。大多数在线示例代码都显示了具有以下基本对象的解决方案:

用作数据管道的阻塞队列

n 个将消息推送到队列的生产者

n 个正在从队列中轮询数据的消费者

通常,消费者被提交到线程池来完成实现。

我研究的另一个选项,几乎没有在线表示,只是将任务作为可运行对象提交到固定线程池。
在此实现中,处理消息的业务逻辑是在 Runnable 对象的 run() 方法中实现的。当我们有一条想要处理的新消息时,我们可以简单地向 FixedThreadPool 提交该类型的新任务,然后......就是这样。正在运行的线程数量由 FixedThreadPool 实现以及轮询消息的逻辑来管理,剩下我们需要实现的就是我们用例的业务逻辑。
谁能解释为什么这个解决方案被忽视?
当 java 语言已经为我们实现了阻塞队列和轮询时,是否有任何具体原因需要使用阻塞队列和轮询?

public class ProducerConsumerExample{

private ExecutorService pool;

public ProducerConsumerExample(int numberOfThreads){
this.pool = Executors.newFixedThreadPool(numberOfThreads);
}

public void submit(MessageObject msg){
pool.submit(new MessagePrinter(msg));
}

}

public class MessagePrinter implements Runnable{
private MessageObject msg;

public MessagePrinter(MessageObject msg){
this.msg = msg;
}

@Override
public void run() {
//only need to implement logic that is releavent for our use case
System.out.println("Message recieved " + msg.toString());
}
}

public static void main(String[] args){
ProducerConsumerExample ex = new ProducerConsumerExample(5);
for(int i=0;i<WHATEVER;i++){
ex.submit(new MessageObject());
}
}

最佳答案

您的方法没有任何问题,只是在 Executors.newFixedThreadPool(). 创建的池中使用什么队列并不明显。您确定无法获取 RejectedExecutionException如果任务数量变得相当大?

因此,最好使用新的显式创建任务队列,并具有预定义的大小。看Executors.newFixedThreadPool(int)的源码.

关于Java 生产者消费者 - 为什么不是一个简单的固定线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56669378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com