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