当前位置:  开发笔记 > 编程语言 > 正文

我如何包装一个方法,以便在超过指定的超时时可以终止它的执行?

如何解决《我如何包装一个方法,以便在超过指定的超时时可以终止它的执行?》经验,为你挑选了3个好方法。

我有一个方法,我想打电话.但是,我正在寻找一种干净,简单的方法来杀死它或强迫它返回,如果执行时间太长.

我正在使用Java.

为了显示:

logger.info("sequentially executing all batches...");
for (TestExecutor executor : builder.getExecutors()) {
logger.info("executing batch...");
executor.execute();
}

我认为TestExecutor班级应该implement Callable继续向这个方向发展.

但我想要做的就是停止,executor.execute()如果它花了太长时间.

建议...?

编辑

收到的许多建议都假设正在执行的方法需要很长时间才能包含某种循环,并且可以定期检查变量.然而,这种情况并非如此.因此,某些东西不一定是干净的,只会停止执行,这是可以接受的.



1> Alex..:

你应该看一下这些类: FutureTask,Callable,Executors

这是一个例子:

public class TimeoutExample {
    public static Object myMethod() {
        // does your thing and taking a long time to execute
        return someResult;
    }

    public static void main(final String[] args) {
        Callable callable = new Callable() {
            public Object call() throws Exception {
                return myMethod();
            }
        };
        ExecutorService executorService = Executors.newCachedThreadPool();

        Future task = executorService.submit(callable);
        try {
            // ok, wait for 30 seconds max
            Object result = task.get(30, TimeUnit.SECONDS);
            System.out.println("Finished with result: " + result);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        } catch (TimeoutException e) {
            System.out.println("timeout...");
        } catch (InterruptedException e) {
            System.out.println("interrupted");
        }
    }
}


我唯一想补充的是`finally {executorService .shutdown(); 做一些清理工作.

2> Dan Dyer..:

Java的中断机制适用于这种情况.如果您希望中止的方法是执行循环,只需让它在每次迭代时检查线程的中断状态.如果它被中断,则抛出InterruptedException.

然后,当你想要中止时,你只需要在适当的线程上调用中断.

或者,您可以使用Sun建议的方法替代已弃用的停止方法.这不涉及抛出任何异常,该方法将正常返回.



3> Tim Stewart..:

我假设在以下语句中使用多个线程.

我已经在这个领域做了一些阅读,大多数作者说杀死另一个线程是个坏主意.

如果要杀死的函数可以设计为定期检查变量或同步原语,然后在设置了该变量或同步原语时干净地终止,那将非常干净.然后某种监视器线程可以休眠几毫秒,然后设置变量或同步原语.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有