【问题标题】:Why did my interrupt() not kill my thread? [duplicate]为什么我的中断()没有杀死我的线程? [复制]
【发布时间】:2021-01-08 17:36:28
【问题描述】:

我在 AEM 中有一个名为“helper”的 Java 类,sn-p 如下所示:

public class Helper extends Thread{
    ................
      private String glossaryText;
      public String getGlossaryText() {
           Thread thread = new Thread() {
              public void run() {
                  glossaryText = getGlossaryHTML();
            }
        };
        try {
           thread.start();
        }
        catch(Exception e) {
        
        }finally {
           //this does NOT stop the thread
         thread.interrupt(); 
        }
        System.out.println(thread.isAlive());
        return glossaryText;
   }
 ........
 }

问题是,无论我做什么,System.out.println(thread.isAlive()); 总是打印“true”。 thread.interrupt(); 没有停止线程。

【问题讨论】:

  • 你为什么认为interrupt() 会杀死Threaddocumentation 只表示“将设置此线程的中断状态。” 由线程的run() 方法来查询线程的状态并采取相应措施。如果没有做这样的检查,中断Thread不会有任何效果。
  • 方法Thread#interrupt 不会“停止”或“杀死”线程。此方法设置Thread 的标志,线程可以检查该标志以采取相应的行动。如果线程在调用时被阻塞,它也会抛出一个InterruptedException

标签: java multithreading thread-safety aem


【解决方案1】:

interrupt() 不能立即停止线程。这只是给线程的一个信号,它应该很快自行停止。您必须自己对此做出反应。

问题是,您不必等待线程结束。您只需启动线程,发出信号停止然后检查它是否还活着。在thread.start() 和您的打印之间执行线程的可能性非常小,但在大多数情况下,执行线程将结束处理getGlossaryText()

你可以在你的 print 前面放一个thread.join(500);,然后你的线程将不再活动,因为它等待线程被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多