我正在开发一个需要异步运行多个任务的 Java 项目。我被引导相信 Executor 是我做到这一点的最佳方式,所以我正在熟悉它。(是的,学习是有报酬的!)但是,我不清楚什么是完成我想做的事情的最佳方法。
为了争论,假设我有两个任务正在运行。两者都不会终止,并且两者都应该在应用程序的生命周期内运行。我正在尝试编写一个主包装类,以便:
- 如果任一任务抛出异常,包装器将捕获它并重新启动任务。
- 如果任一任务运行完成,包装器将注意到并重新启动任务。
现在,应该注意的是,这两个任务的实现都会将代码包装run()
在一个永远不会运行到完成的无限循环中,并使用一个 try/catch 块来处理所有运行时异常而不会中断循环。我试图增加另一层确定性;如果我或跟随我的人做了一些愚蠢的事情,破坏了这些保护措施并停止了任务,应用程序需要做出适当的反应。
有没有比我更有经验的人推荐的解决这个问题的最佳实践?
FWIW,我已经启动了这个测试类:
public class ExecTest {
private static ExecutorService executor = null;
private static Future results1 = null;
private static Future results2 = null;
public static void main(String[] args) {
executor = Executors.newFixedThreadPool(2);
while(true) {
try {
checkTasks();
Thread.sleep(1000);
}
catch (Exception e) {
System.err.println("Caught exception: " + e.getMessage());
}
}
}
private static void checkTasks() throws Exception{
if (results1 == null || results1.isDone() || results1.isCancelled()) {
results1 = executor.submit(new Test1());
}
if (results2 == null || results2.isDone() || results2.isCancelled()) {
results2 = executor.submit(new Test2());
}
}
}
class Test1 implements Runnable {
public void run() {
while(true) {
System.out.println("I'm test class 1");
try {Thread.sleep(1000);} catch (Exception e) {}
}
}
}
class Test2 implements Runnable {
public void run() {
while(true) {
System.out.println("I'm test class 2");
try {Thread.sleep(1000);} catch (Exception e) {}
}
}
}
它以我想要的方式运行,但我不知道是否有任何陷阱、效率低下或完全错误的想法等着让我大吃一惊。(事实上,鉴于我是新手,如果没有什么问题/不明智的话,我会感到震惊。)
欢迎任何见解。