Я работаю над проектом Java, где мне нужно, чтобы несколько задач выполнялись асинхронно. Я убежден, что Исполнитель - лучший способ для меня сделать это, поэтому я знакомлюсь с ним. (Я получаю деньги, чтобы учиться!) Однако мне непонятно, какой лучший способ - выполнить то, что я пытаюсь сделать.
Для аргумента предположим, что у меня две задачи. Ожидается, что ни один из них не завершится, и оба должны работать в течение срока действия приложения. Я пытаюсь написать основной класс-оболочку, чтобы:
- Если какая-либо из задач выдает исключение, оболочка поймает ее и перезапустит задачу.
- Если любая задача выполняется до завершения, оболочка заметит и перезапустит задачу.
Теперь следует отметить, что реализация для обеих задач будет завершать код в 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) {}
}
}
}
Он ведет себя так, как я хочу, но я не знаю, есть ли какие-либо ошибки, неэффективность или просто неправильная голова, ожидающая удивить меня. (На самом деле, учитывая, что я новичок в этом, я был бы потрясен, если бы не было что-то не так/нецелесообразно.)
Любое понимание приветствуется.