【发布时间】:2021-06-26 06:47:00
【问题描述】:
假设:
- 有 10 个任务
- 有 3 个线程
- 有 3 个数组列表
- 每个线程都与 1 个 arrayList 相关
我的问题是:如何管理资源?例如,第一步 3 任务将使用 3 个线程和 3 个 arrayLists 执行。然后只要有可用的线程,第 4 个任务将与可用的 arrayList 一起执行。如何在 Java 中做到这一点?请给我参考或源代码。
public class NewClass {
private Queue<Integer> availableCore = new LinkedList();
public void manage() throws InterruptedException {
ArrayList<ArrayList<Integer>> data = new ArrayList<>();
data.add(new ArrayList<>());
data.add(new ArrayList<>());
data.add(new ArrayList<>());
availableCore.add(0);
availableCore.add(1);
availableCore.add(2);
ArrayList<Calculate> allThreads = new ArrayList<>();
ExecutorService es = Executors.newWorkStealingPool(3);
int threadCount = -1;
int numOfTask = 10;
while (numOfTask > 0) {
if (!availableCore.isEmpty()) {
System.out.println(availableCore.element());
threadCount++;
int core = availableCore.remove();
allThreads.add(new Calculate(data.get(core), numOfTask, core));
es.execute(allThreads.get(threadCount));
numOfTask--;
}
}
es.shutdown();
boolean finished = es.awaitTermination(1, TimeUnit.DAYS);
System.out.println("Done\n");
for (int i = 0; i < data.size(); i++) {
System.out.println(data.get(i));
}
}
public class Calculate extends Thread {
private ArrayList<Integer> data;
private int start;
private int core;
public Calculate(ArrayList<Integer> data, int start, int core) {
this.data = data;
this.start = start;
this.core = core;
}
@Override
public void run() {
this.data.add(start);
availableCore.add(this.core);
}
public int getCore() {
return core;
}
}
}
上面的这段代码代表了我的实际问题。当我尝试运行几次时,有时会在“availableCore.element()”中出现错误。它说availableCore是空的,但我做了一个条件,确保它不为空。
if (!availableCore.isEmpty()) {
System.out.println(availableCore.element());
【问题讨论】:
标签: java multithreading concurrency parallel-processing load-balancing