java - 如何避免在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();
}
}
}
解决方案
一种方法可能是将中断检查和方法调用包装在一些 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);
}
}
推荐阅读
- aws-chime-sdk - 如何为基于 AWS chime 服务器的应用程序启用会议记录?
- python - 使用一个函数调用另一个函数
- python - 使用 Pandas 在 Python 中过滤嵌套的 JSON 数据
- c# - 有没有办法在运行时使用 Entity Framework Core(代码优先)将旧版本模型实例添加到数据库?
- c# - 静态变量在 Unity 中不显示
- laravel - Laravel old() 输入偶尔会返回一个数组
- linux - 在 BASH 中,如何在递归“查找”的文件的复制语句中引用目录名称
- html - 用户名/密码浏览器自动填充不起作用
- php - 已弃用:class-smtp.php 自 5.5.0 版起已弃用
- mongodb - 由Docker-compose创建的mongodb,不创建初始数据库?