繁体   English   中英

如何与执行器服务线程进行通信

[英]how to communicate with Executor Service Threads

从控制器类,我正在调用此Helper来启动一个过程,并返回到该过程开始的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方法。 但我猜只有两个对象都是单例对象时,它才起作用。 并且由于单例对象只有一个实例,我可能最终也会停止其他当前正在运行的服务。 (不确定,需要澄清)。

谢谢。

在每个级别上都保留对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指示Callable / 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();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM