2017-09-13 51 views
0

從控制器類溝通,我打電話這個助手啓動一個進程並返回到該進程啓動的UI如何與執行官服務線程

助手類:

public class Helper { 

public String startService() { //Before starting the service I save the status of the service as Started in the DB 

    ExecutorService service = Executors.newSingleThreadExecutor(); 
    service.submit(new Runnable() { 
     public void run() { 
     new Worker().startWork(callableTaskList); 
      } 
     }); 
return "started" 
    } 
public void stopService() { 
// I Saved the status in DB as Stopping (Just in case). but now how to pass flag an to pass to startWorkMethod to stop if some flag in false and stop processing. 
} 

工人階級

public class Worker { 

    public void startWork(List<CallableTask> callableTaskList) throws Exception { 
     ExecutorService service=Executors.newFixedThreadPool(50); 
     ExecutorService anotherService=Executors.newFixedThreadPool(50); 
for (List<CallableTask> partition : Iterables.partition(callableTaskList, 500)){ 
      // do some work here and then return 
      List<Future<String>> futures=service.invokeAll(partition); 
      for(Future<String> future: futures){ 
       anotherService.submit(new Task(future.get())); 
      } 
     } 

現在我的問題是如何停止已啓動的服務?由於callableTaskList是一個巨大的列表,我已經將它分爲批處理和處理它。現在,如果我想停止這個過程,我該怎麼做? 我認爲應該在worker類中有一個標誌,它應該在每次分區運行後檢查,如果我應該繼續這個工作。 但我不明白如何將這個標誌傳遞給工人類。我創建了一個停止服務方法,我想創建一個易失性原子布爾標誌並將其傳遞給startWork方法。但我想只有當它們都是單體對象時它纔會起作用。並且由於單例對象只有一個實例,所以我最終可能會停止其他當前正在運行的服務。 (不確定,需要澄清)。

謝謝。

+0

呀。現在明白了。謝謝 – Kid101

回答

0

在每個級別保留對ExecutorService的引用,以便可以調用shutdownNow()。例如:

public class Helper { 
     private ExecutorService service; 

     public String startService() { 
      // ExecutorService service = Executors.newSingleThreadExecutor(); 
      service = Executors.newSingleThreadExecutor(); 
      service.submit(new Runnable() { 
       public void run() { 
        new Worker().startWork(callableTaskList); 
       } 
      }); 
      return "started" 
     } 

    public void stopService() { 
     service.shutdownNow(); 
    } 
} 

然而,對於這項工作的API表示可贖回/的Runnable必須表現良好,當它被中斷響應。

例如:

public class Worker { 
     private ExecutorService service; 
     private ExecutorService anotherService; 

     public void startWork(List<CallableTask> callableTaskList) throws Exception { 
      service=Executors.newFixedThreadPool(50); 
      anotherService=Executors.newFixedThreadPool(50); 

      for (List<CallableTask> partition : Iterables.partition(callableTaskList, 500)){ 
       checkInterruptStatus(); 


       // do some work here and then return 
       List<Future<String>> futures=service.invokeAll(partition); 
       for(Future<String> future: futures){ 
        checkInterruptStatus(); 

        anotherService.submit(new Task(future.get())); 
       } 
      } 
     } 

     private void checkInterruptStatus() throws InterruptedException { 
      if (Thread.currentThread().isInterrupted()) { 
       throw new InterruptedException(); 
      } 
     } 

     public void stopService() { 
      service.shutdownNow(); 
      anotherService.shutdownNow(); 
     } 
    } 
相關問題