2016-07-12 6 views
2

同時に実行する必要があるスレッドのリストがあります。私は最初にexecutorserviceを使ってこれをやっていました。実行する必要があるスレッドはDBから来ており、クラス名を取得してvendorDetailsリストに格納しています。指定された時間後にmanagedexecutorserviceを使用しているシャットダウンスレッド

for (Object vendorThread : vendorDetails) { 
      String thread = (String) vendorThread; 
      //timeout = details.getTimeout(); 
      Runnable worker = null; 
      try { 
       Class c = Class.forName(thread); 
       Constructor<?> cons = c.getConstructor(SearchRequest.class, Results.class); 
       worker = (Runnable) cons.newInstance(searchRequest, Results); 
      } catch (Exception e) { 
       //e.printStackTrace(); 
      } 
      if (worker == null) { 
       System.out.println("------------------------ WORKER IS NULL ---------------"); 
      } 
      executor.execute(worker); 
     } 
     executor.shutdownNow(); 
     try { 
      if (!executor.isTerminated()) { 
       executor.awaitTermination(timeout, TimeUnit.SECONDS); 
      } 

     } catch (InterruptedException ex) { 
      //ex.fillInStackTrace(); 
     } 

私はManagedExecutorServiceを使用していますので、EJBに似た何かを達成したいです。

@EJB 
    private ThreadName1 threadName1 ; 
    @EJB 
    private ThreadName2 threadName2 ;  
for (Object vendorThread : vendorDetails) { 
       System.out.println("in for loop"); 
       String thread = (String) vendorThread; 
       System.out.println("thread:" + thread); 
       //timeout = details.getTimeout(); 
       Runnable worker = null; 
       try { 
        if (thread.equals("threadName1")) { 
         System.out.println("in if"); 
         threadName1.setReqRes(SearchRequest, Results); 
         worker = (Runnable) threadName1; 
        } else if (thread.equals("threadName2")) { 
         System.out.println("in spice if"); 
         threadName2.setReqRes(SearchRequest, Results); 
         worker = (Runnable) threadName2; 
        } 
        System.out.println("after if"); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       if (worker == null) { 
        System.out.println("------------------------ WORKER IS NULL ---------------"); 
       } 

       System.out.println("before execute"); 
       //managedExecutorService.execute(worker); 
       managedExecutorService.submit(worker); 
       System.out.println("after execute"); 
      } 
      System.out.println("before shutdown"); 
      //managedExecutorService.shutdownNow(); 
      System.out.println("after shutdown"); 
      try { 
       System.out.println("after shutdown"); 
       /*if (!managedExecutorService.isTerminated()) { 
        managedExecutorService.awaitTermination(timeout, TimeUnit.SECONDS); 
       }*/ 

      } catch (InterruptedException ex) { 
       ex.fillInStackTrace(); 
       // ex.printStackTrace(); 
      } 

は、理想的には私は、スレッドが30secsを言う規定の時間のために実行し、その後のスレッドがその実行を完了した方の結果を返すようにしたいです。 問題がシャットダウンなどのスレッドライフサイクルメソッドを呼び出すと、例外がスローされます。 これはどのように達成できますか? 私はデフォルトのManagedExecutorSerivceを使用しています。

答えて

0

これが適切な解決策であるかどうかわかりません。しかし、私はこれを回避策として今行っています。送信されたすべてのタスクを将来のリストに追加する。その後、指定された時間待機し、実行中のタスクをすべてキャンセルします。より洗練されたソリューションがあると確信しています。

    ArrayList<Future> taskList = new ArrayList<>();   
        for (Object vendorThread : vendorDetails) { 
         System.out.println("in for loop"); 
         String thread = (String) vendorThread; 
         System.out.println("thread:" + thread); 
         //timeout = details.getTimeout(); 
         Runnable worker = null; 
         try { 
          if (thread.equals("threadName1")) { 
           System.out.println("in if"); 
           threadName1.setReqRes(SearchRequest, Results); 
           worker = (Runnable) threadName1; 
          } else if (thread.equals("threadName2")) { 
           System.out.println("in spice if"); 
           threadName2.setReqRes(SearchRequest, Results); 
           worker = (Runnable) threadName2; 
          } 
          System.out.println("after if"); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
         if (worker == null) { 
          System.out.println("------------------------ WORKER IS NULL ---------------"); 
         } 

         System.out.println("before execute"); 
         //managedExecutorService.execute(worker); 
         taskList.add(managedExecutorService.submit(worker));; 
         System.out.println("after execute"); 
        } 
        System.out.println("before shutdown"); 
        //managedExecutorService.shutdownNow(); 
        System.out.println("after shutdown"); 
        try { 
         System.out.println("after shutdown"); 
         /*if (!managedExecutorService.isTerminated()) { 
          managedExecutorService.awaitTermination(timeout, TimeUnit.SECONDS); 
         }*/ 
       System.out.println("before sleep"); 
       long startTimeLogon = System.currentTimeMillis(); 
       boolean allComplete; 
       int trueCount = 0; 
       while (true) { 
        System.out.println("true count " + trueCount++); 
        if ((System.currentTimeMillis() - startTimeLogon) >= timeout * 1000) { 
         break; 
        } 
        allComplete = true; 
        for (Future f : taskList) {      
         if (!f.isDone()) { 
          allComplete=false; 
         } 
        } 
        if(allComplete) 
         break; 
        Thread.sleep(250); 
       } 
       System.out.println("after sleep"); 
       for (Future f : taskList) { 
        if (!f.isDone()) { 
         f.cancel(true); 
        } 
       } 
       System.out.println("after cancel"); 

        } catch (InterruptedException ex) { 
         ex.fillInStackTrace(); 
         // ex.printStackTrace(); 
        } 
関連する問題