JAVA如何终止一个运行时间很长的后台线程?

我知道thread的stop方法已经不建议用了,一般都推荐用interrupt,但是这样写不起来不是很麻烦吗? 比如我的线程里包括有N个步骤,类似:
public void run() {

step1();
step2();
step3();
......
stepN();

}

为了能够及时的响应终止,难道要到处加上isInterrupted的判断?
public void run() {

step1();
if (isInterrupted()) return;
step2();
if (isInterrupted()) return;
step3();
if (isInterrupted()) return;
......
stepN();

}

这种判断加的到处都是,感觉很不优雅,没有更好的做法吗?

阅读 3.9k
2 个回答

只能这样,java thread的interrupt是交互式的,不存在硬性关闭的机制

新手上路,请多包涵

可以借助于Google guava来实现优雅的任务超时退出机制。

ExecutorService executorService = Executors.newFixedThreadPool(1);
        SimpleTimeLimiter stl = new SimpleTimeLimiter(executorService);
        String result = null;
        try {
            result = stl.callWithTimeout(() -> {
                Thread.sleep(3000);
                return "result";
            }, 4, TimeUnit.SECONDS, true);
            System.out.println("正常调用:" + result);
        } catch (Exception e) {
            System.out.println("超时调用:" + result);
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题