2016-07-12 2 views
2

У меня есть список потоков, которые необходимо выполнить одновременно. Я делал это с использованием службы-исполнителей на начальном этапе. Нити, которые нужно выполнить, поступают из БД, и я извлекаю их имена классов, сохраняя их в списке 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(); 
     } 

Я хочу, чтобы достичь чего-то подобного в EJB поэтому я использую ManagedExecutorService.

@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, а затем возвращать результаты в зависимости от того, потоки завершили их исполнение. Теперь проблема вызывает любые методы threadlifecycle, такие как shutdown и т. Д. Выдает исключение. Как это достичь? Я использую по умолчанию 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(); 
        } 
Смежные вопросы