繁体   English   中英

杀死使用执行程序服务异步调用的线程

[英]Killing a thread invoked asynchronously using executor service

我正在尝试为由执行程序异步调用的线程实现超时。

处理流程如下:

线程1:使用以下代码启动要在线程2上运行的任务,并立即返回而无需等待Future对象的结果

线程2:漫长的过程,并会更新一些存储一些结果,最后在缓存中

现在,要求是在某个超时值后杀死线程2 ,而不会阻塞线程1

代码段:

    ExecutorService executor = Executors.newFixedThreadPool(1);
    Future<Task> future = executor.submit(new Callable<Task>() {

        public Task call() throws Exception {
            try{

            return new Task();
            }catch (Exception e) {
            //print stack
        }

        }
    });

有什么见解/建议可以实现吗?

请参阅以下答案: https : //stackoverflow.com/a/2733370/1299078

但是,根据Thread-2的功能,您可以让线程定期结束,即在http请求或DB语句上定义超时,或者如果您有循环,请定义退出条件。 这样,您可能会得到一个更合适的解决方案,并且能够正确释放资源。

您无法使用Java的ExecutorService来执行此操作,因为它不会向超时公开任何方法,也不会杀死/完成/完成新产生的线程。

但是,如果必须执行此操作,则可以直接使用Thread类来执行此操作,以下是高级方法:

  • 从主线程t1产生您的工作线程t2,该线程应该可以完成您的长时间工作。
  • 在您的t1中,您将拥有t2的ORV,将新线程t3随时间传递给它,然后您希望t2完成。
  • 在t3中(如果愿意,您也可以在t1中执行此操作,但是由于您不希望阻塞t1,因此您需要另一个线程来完成此工作),一旦经过该时间,请调用t2.interrupt() ,这将基本上中断了t2线程。
  • 现在在t2中,您将必须定期检查线程是否被中断(使用if (Thread.interrupted()) { ),如果if (Thread.interrupted()) {被中断,则您可以做任何想做的事情-因此只需返回完成/杀死/完成线程。

基本的ExecutorService不提供超时功能。

您可以实现自己的@hagrawal等中记载的超时或者您可以使用番石榴具有非常好的实施你问了这里

暂无
暂无

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

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