首页 > 解决方案 > 如何避免在JAVA中检查线程到处中断

问题描述

我有两个算法 A,B 用于计算 NP 难题的解决方案,这可能需要很多时间。然后在主线程 MI 中分别为算法 A 和算法 B 创建线程 A 和线程 B。当线程A或线程B中的任何一个完成计算或两者都达到超时时,M在那些未完成的线程上调用中断。M 对 5,000 多个测试用例重复此过程。

由于算法 A 和 B 没有任何可中断的操作,中断不会导致中断异常,因此这些未完成的线程将继续在后台运行,最终耗尽堆内存,因为未完成的线程越来越多。

然后我需要手动检查isInterrupted两种算法中的线程。但我不想到处检查它们的效率和代码可读性问题。

例如,原始算法是

public class AlgA {
  public void run() {
    do1();
    do2();
    ...
    do100();
  }
}

我不想

public class AlgA {
  public void run() throws InterruptedException {
    do1();
    check();
    do2();
    check();
    ...
    check();
    do100();
  }
  private void check() throws InterruptedException {
    if (Thread.interrupted()) {
      throw new InterruptedException();
    }
  }
}

标签: javamultithreadinginterrupt

解决方案


一种方法可能是将中断检查和方法调用包装在一些 util mehtod 中:

public class AlgA {
  protected static void checkAndCall(Runnable action) 
      throws InterrruptedException {
    if (Thread.interrupted()) {
      throw new InterruptedException();
    }
    action.run()
  }

  public void run() {
    checkAndCall(this::do1);
    checkAndCall(this::do2);
    ...
    checkAndCall(this::do100);
  }
}

推荐阅读