【发布时间】:2017-08-08 04:18:06
【问题描述】:
这是我的代码:
class Processor implements Runnable {
private int id;
private Integer interaction;
private Set<Integer> subset;
private static volatile AtomicBoolean notRemoved = new AtomicBoolean(true);
public Object<E> dcp;
public Iterator<Integer> iterator;
public Processor(int id, Integer interaction, Set<Integer> subset, Object<E> dcp, Iterator<Integer> iterator) {
this.id = id;
this.interaction = interaction;
this.subset= subset;
this.dcp = dcp;
this.iterator = iterator;
}
public void run() {
while (Processor.notRemoved.get()){
System.out.println("Starting: " + this.id);
if (this.dcp.PA.contains(this.interaction)){
this.subset.add(this.interaction);
this.dcp.increaseScore(this.subset);
if (!this.subset.contains(this.interaction) && Processor.notRemoved.get()){
Processor.notRemoved.set(false);
iterator.remove();
}
}
System.out.println("Completed: " + this.id);
}
}
}
public class ConcurrentApp {
public void mainFunction (Object<E> dcp, int threads) {
ExecutorService executor = Executors.newFixedThreadPool(threads);
int i =1;
while ((dcp.PA.size() > i) && (i <= dcp.R)){
for (Iterator<Integer> iterator = dcp.PA.iterator(); iterator.hasNext();){
Integer interaction = iterator.next();
ArrayList<Integer> removed = new ArrayList<Integer>(dcp.PA);
removed.remove(interaction);
ArrayList<Set<Integer>> subsets = dcp.getSubsets(removed, i);
for (int j = 0; j< subsets.size(); j++){
executor.submit(new Processor(j, interaction, subsets.get(j), dcp, iterator));
}
executor.shutdown();
System.out.println("All tasks submitted");
try {
executor.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
System.out.println("HERE");
e.printStackTrace();
}
}
System.out.println("All tasks completed");
i++;
}
}
}
当我在 ConcurrentApp 中运行 mainFunction 时,我收到以下错误: 线程“main”中的异常 java.util.concurrent.RejectedExecutionException:任务 java.util.concurrent.FutureTask@2c7b84de 从 java.util.concurrent.ThreadPoolExecutor@3fee733d 被拒绝 [已终止,池大小 = 0,活动线程 = 0 , 排队任务 = 0, 已完成任务 = 8]
我知道这是因为我没有正确使用 executor.shutdown() 但我不知道为什么?
编辑:我在每个线程启动并完成其任务时打印。这是控制台输出:
Starting: 1
Starting: 2
All tasks submitted
Starting: 0
Completed: 2
Completed: 1
Completed: 0
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@2c7b84de rejected from java.util.concurrent.ThreadPoolExecutor@3fee733d[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 8]
这至少表明线程池中的 3 个线程在错误消失之前完成了它们的任务。
【问题讨论】:
-
“volatile AtomicBoolean”不是必需的。使用其中一个
-
@efekctive 哦,是的!谢谢你的收获。我忘了 AtomicBoolean 已经是 volatile 了。
-
你会尝试以下方法:切换提交以执行?
-
不走运,我得到了同样的错误:/
-
我现在卡住了。但我会在调用关机之前检查活动计数 == 0
标签: java multithreading concurrency threadpool java.util.concurrent