java - Java 8:ArrayDeque<>.poll 在并行环境中返回 null
问题描述
我正在尝试维护多个线程之间的项目列表,每个线程一个(例如,每个线程一个套接字连接)。我将这个列表保存在一个ArrayDeque<>
. 我面临的问题ArrayDeque<>
是超过没有的项目。线程池中的线程数。
这是我的代码:
package com.practice;
import java.util.ArrayDeque;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class CompletableFutureApp implements AutoCloseable {
private static void sleep(long timeMS) {
try {
Thread.sleep(timeMS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try (CompletableFutureApp completableFutureApp = new CompletableFutureApp()) {
Runnable[] tasksList1 = new Runnable[100];
for (int i = 0; i < tasksList1.length; i++) {
String msg1 = "TaskList 1 no.: " + i;
tasksList1[i] = () -> {
//System.out.println(msg1);
sleep(300);
};
}
completableFutureApp
.executeTasks(tasksList1)
.thenRun(() -> System.out.println("All tasks completed successfully"));
}
}
private ExecutorService threadPool = Executors.newWorkStealingPool(10);
private ArrayDeque<Integer> itemsAvailable = new ArrayDeque<>();
private CompletableFuture executeTasks(Runnable... tasks) {
CompletableFuture[] futures = new CompletableFuture[tasks.length];
for (int i = 0; i < tasks.length; i++) {
Runnable task = tasks[i];
futures[i] = CompletableFuture.runAsync(() -> {
Integer item = itemsAvailable.poll();
if (item == null)
item = new Random().nextInt();
task.run();
itemsAvailable.add(item);
System.out.println("Items available: " + itemsAvailable.size());
}, threadPool);
}
return CompletableFuture.allOf(futures).thenRun(() -> System.out.println("Items available at last: " + itemsAvailable.size()));
}
@Override
public void close() {
threadPool.shutdown();
try {
threadPool.awaitTermination(100, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在我的代码中,我正在创建一个大小为 10 的工作窃取池,谁能告诉我为什么不。在这种情况下,元素的ArrayDeque<>
数量超过 10?
解决方案
推荐阅读
- angular - 在组件中加载 facebook 页面的角度问题
- linux - Gstreamer:缺少 vaapih264enc,即使存在其他 vaapi 元素
- javascript - 如何在不破坏其他脚本的情况下将外部脚本嵌入我的页面
- javascript - 赛普拉斯没有点击元素
- c - 在 c 中使用 fscanf() 时遇到问题
- javascript - 直接到两个按钮之间的特定页面?
- laravel - 我应该检查引导程序/缓存 - Laravel 5.8 吗?
- javascript - 使用 javascript 调试器时突出显示变量不再在 Chrome 开发工具中工作
- javascript - 如何从顶部开始画布弧形填充
- c++ - 指向地址的指针似乎已超出范围