使用执行程序服务

时间:2018-02-13 15:21:08

标签: java multithreading timeout executorservice

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

流程如下:

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

线程-2:漫长的进程并且会更新一些结果存储在缓存中的结果

现在,要求是在超过一些超时值后终止 Thread-2 而不阻塞Thread-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
        }

        }
    });

有任何见解/建议来实现这个目标吗?

3 个答案:

答案 0 :(得分:0)

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

但是根据Thread-2的作用,你可以让线程定期结束,即在http-request或DB语句中定义超时,或者如果你有一个循环,则定义一个退出条件。通过这种方式,您可以获得更合适的解决方案,并且能够正确地释放资源。

答案 1 :(得分:0)

您无法使用Java的ExecutorService执行此操作,因为它不会将任何方法暴露给超时并终止/完成/完成新生成的线程。

但是,如果你必须这样做,那么你可以通过直接使用Thread类来实现,下面是高级方法:

  • 从你的主线程t1,产生你的工作线程t2,这应该是你的长期工作。
  • 在你的t1中,你将拥有t2的ORV,传递一个新的线程t3以及你希望t2完成的时间。
  • 在t3中(如果您愿意,也可以在t1中执行此操作,但由于您不希望阻止t1,因此您需要另一个线程来完成此工作),一旦该时间结束,请致电t2.interrupt() ,这基本上会打断t2线程。
  • 现在在t2中,你将不得不定期继续检查线程是否被中断(使用if (Thread.interrupted()) {),如果它被中断,那么你可以做你想做的任何事情 - 只需返回完成/杀死/完成线程。

答案 2 :(得分:0)

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

您可以像@hagrawal所描述的那样自己实现超时,或者您可以使用guava,它具有非常好的实现,可以满足您的要求here