0

ThreadPoolの使用している場合は、私のコードです:取得エラーFutureTask @ 2c7b84de拒否をここで

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を実行すると、私は次のエラーを取得:スレッド「メイン」java.util.concurrentの 例外を.RejectedExecutionException:[email protected]から拒否されたタスク[email protected] [終了したプールサイズ= 0、アクティブスレッド= 0、キューに入れられたタスク= 0、完了したタスク= 8]

これは私が使用していないためだと知っていますexecu tor.shutdown()正しくは、私はなぜわからないのですか?

EDIT:各スレッドが開始してタスクを完了すると印刷されます。ここでは、コンソール出力は次のとおりです。

Starting: 1 
Starting: 2 
All tasks submitted 
Starting: 0 
Completed: 2 
Completed: 1 
Completed: 0 
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 8] 

これは、少なくともエラーがオフになる前に、スレッドプール内の3つのスレッドがそのタスクを完了することを示しています。

+0

"volatile AtomicBoolean"は不要です。どちらか一方を使用してください – efekctive

+0

@efekctive OH YEAH!捕まえてくれてありがとう。 AtomicBooleanはすでに揮発性です。 –

+0

あなたは以下を試しますか?switch submit for execute? – efekctive

答えて

0

ここで問題を見つけました。すべてのタスクが完了する前に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(); 
     } 
    } 
関連する問題