java - 使用线程池时出现错误 FutureTask@2c7b84de 被拒绝

标签 java multithreading concurrency threadpool java.util.concurrent

这是我的代码:

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, Activity 线程= 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 个线程在错误消失之前完成了任务。

最佳答案

我在这里找到了问题所在!这只是因为我在所有任务完成之前在 while 循环中调用了 executor.shutdown() 。所以新的代码是:

    public void multiRemoveParents (DirectCausalPredictor<BayesianScoresNew> 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++){
                    try {
                        executor.submit(new Processor(j, interaction, subsets.get(j), dcp, iterator));
                    } catch (RejectedExecutionException e){
                        System.out.println("Task was rejected");
                    }   
                }
            }
            System.out.println("All tasks completed");
            i++;
        }
        executor.shutdown();
        System.out.println("All tasks submitted");
        try {
            executor.awaitTermination(1, TimeUnit.DAYS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

关于java - 使用线程池时出现错误 FutureTask@2c7b84de 被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42843427/

相关文章:

java - 分析线程转储 - sun.misc.Unsafe.park 上有很多被阻塞的线程

c++ - C++ 中多线程的 join() 和 detach() 有什么不同?

select - Go select 语句解决方法中的优先级

mysql - 如何分离这两个过程?

java - 如何在 Hibernate 的多列索引中指定列的顺序?

java - 在java中取字符串的一部分

java - 东方数据库。如何判断数据库是否在池中?

java - 在Java中管理错误日志

java - 用Java监控两台打印机

sqlite - 嵌入式(进程内)数据库 H2、Hsqldb、Apache Derby、SQLite (JDBC) 中的并发