2017-09-13 48 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(); 
     } 
    } 
相关问题