gpt4 book ai didi

java - Java中如何使用固定数量的线程来运行一定数量的任务

转载 作者:行者123 更新时间:2023-12-02 02:19:07 24 4
gpt4 key购买 nike

我有特定数量的线程THREAD_POOL_SIZE和一堆可能超过线程数量的任务。我想使用这些 k 线程来运行我的所有任务。我将这些任务放在 BlockingQueue 中,每个线程返回一个结果,稍后应聚合该结果。

这里我编写了一个简单的程序,其中任务是从 1 到 100 的数字,我试图计算所有数字的总和。每个线程将从阻塞队列中选择一个数字并将其返回。我正在使用 Future 来收集我的结果并稍后对其进行求和。

使用 BlockingQueue 的原因是因为我试图解决一个更大的问题,即我可以在阻塞队列中放置任务,并且我有一定数量的线程来运行这些任务。

我想知道如何修复以下代码以使 k 线程继续处理阻塞队列中的条目?

static class Consumer implements Callable<Integer> {
private BlockingQueue<Integer> sharedQueue;

public Consumer(BlockingQueue<Integer> sharedQueue) {
this.sharedQueue = sharedQueue;
}

@Override
public Integer call() {
while(true){
try {
return sharedQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public static void main(String[] args) throws Exception {
int THREAD_POOL_SIZE = 10;
int BLOCKING_QUEUE_SIZE = 100;
BlockingQueue<Integer> sharedQueue = new ArrayBlockingQueue<>(BLOCKING_QUEUE_SIZE);
ExecutorService execService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < BLOCKING_QUEUE_SIZE; i++) {
sharedQueue.add(i);
}

for (int i = 0; i < THREAD_POOL_SIZE; i++) {
futures.add(execService.submit(new Consumer(sharedQueue)));
}

int total = 0;
for (Future<Integer> future : futures) {
try {
total += future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Total count: " + total);
execService.shutdown();
}

感谢您的帮助!

最佳答案

您需要向执行者添加 100 个 future,而不是 10:

for (int i = 0; i < THREAD_POOL_SIZE; i++) {

应该是:

for (int i = 0; i < 100; i++) {
<小时/>

很好奇您认为队列实际上在此处添加了什么。没有它,您可以大大简化代码。

int THREAD_POOL_SIZE = 10;
ExecutorService execService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
List<Future<Integer>> futures = new ArrayList<>();

for (int i = 0; i < 100; i++) {
final int j = i;
futures.add(execService.submit(() -> j));
}

int total = 0;
for (Future<Integer> future : futures) {
try {
total += future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Total count: " + total);
execService.shutdown();

关于java - Java中如何使用固定数量的线程来运行一定数量的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48787431/

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