为了账号安全,请及时绑定邮箱和手机立即绑定

如何强制停止无限循环线程

如何强制停止无限循环线程

墨色风雨 2019-04-10 14:15:11
以下是代码段ExecutorService executor = Executors.newSingleThreadExecutor();executor.submit(() -> {     while (true) System.out.println("1");});executor.shutdown();executor.shutdownNow();有没有办法从外面关闭执行人?(建议不能改变任务本身) 就像linux中的kill -9一样
查看完整描述

4 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

如果你暴露线程执行程序让你运行,那么你可以打断它。对我来说,这只打印14次表明中断成功。

请记住,这依赖于一个事实,即Thread.sleepSystem.out.println是中断的。如果你没有检查Thread.isInterrupted(就像他们两个那样),你仍然可能无法中断线程。

ExecutorService executor = Executors.newSingleThreadExecutor();private void test() throws InterruptedException {
    AtomicReference<Thread> thread = new AtomicReference<>();
    Future<Object> task = executor.submit(() -> {
        // Keep track of the thread.
        thread.set(Thread.currentThread());
        try {
            while (true) {
                Thread.sleep(1000);
                System.out.println("1");
            }
        } finally {
            System.out.println("Interrupted: " + Thread.currentThread().isInterrupted());
        }
    });
    Thread.sleep(5000);
    // Interrupt the thread.
    thread.get().interrupt();
    Thread.sleep(5000);
    System.out.println("Press <Enter> to shutdown");
    new Scanner(System.in).nextLine();
    executor.shutdown();
    System.out.println("Press <Enter> to shutdown NOW");
    new Scanner(System.in).nextLine();
    executor.shutdownNow();}


查看完整回答
反对 回复 2019-05-15
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

Threre在某些方面

  1. 为循环条件添加附加条件,boolean shouldContinue因此将此设置为false将在某个时刻退出循环

  2. 如果您可以编写自己的功能(您拥有应用程序),您可以编写代码来列出所有线程并强制给定线程停止使用Thread#stop(不安全)或Thread#interrupt(更安全)。

  3. 如果您不拥有该应用程序 - 就像您正在运行一些应用程序 - 您可以使用自定义运行它,javaagent这将允许您执行与第2点相同的操作。

2和3,与prober集成,例如套接字,可以允许您在已经运行的进程中从外部执行此操作,例如。来自CLI


查看完整回答
反对 回复 2019-05-15
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

请阅读shutdownNow()方法的javadoc 。它非常清楚地说:

除尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何未能响应中断的任务都可能永远不会终止

因此,您需要做的是在代码中更改提交的任务以响应Thread.interrupt()方法。即你需要更改你的行
while (true)

while (true && !Thread.currentTrhead().isInterrupted())
获取更多细节,在特定方法中读取线程类的 javadoc interrupt()interrupted()以及isInterrupted()


查看完整回答
反对 回复 2019-05-15
  • 4 回答
  • 0 关注
  • 1351 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信