应永久运行的任务的 Java 执行器最佳实践
我正在处理一个Java项目,我需要异步运行多个任务。我被引导相信执行器是我做到这一点的最佳方式,所以我正在熟悉它。(耶伊获得报酬来学习!但是,我不清楚完成我想要做的事情的最佳方法是什么。
为了便于论证,假设我有两个任务在运行。两者都不应终止,并且两者都应在应用程序的生存期内运行。我正在尝试编写一个主包装类,以便:
- 如果任一任务引发异常,包装器将捕获该任务并重新启动该任务。
- 如果任一任务运行到完成,包装器将注意到并重新启动该任务。
现在,应该注意的是,这两个任务的实现都将代码包装在一个永远不会运行到完成的无限循环中,并具有一个 try/catch 块,该块应处理所有运行时异常而不会中断循环。我试图增加另一层确定性;如果我或跟随我的人做了一些愚蠢的事情,击败了这些安全措施并停止了任务,应用程序需要做出适当的反应。run()
有没有比我更有经验的人推荐的解决这个问题的最佳实践?
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) {}
}
}
}
它的行为方式是我想要的,但我不知道是否有任何陷阱,低效率或彻头彻尾的错误等待着我感到惊讶。(事实上,鉴于我是新手,如果没有错误/不明智的事情,我会感到震惊。
欢迎任何见解。