複数のタスクを非同期で実行する必要があるJavaプロジェクトに取り組んでいます。私はExecutorがこれを行うための最良の方法であると信じるように導かれているので、私はそれに精通しています。(学ぶために報酬を得ることができます!)しかし、私がやろうとしていることを達成するための最善の方法が何であるかは私にはわかりません。
議論のために、2つのタスクを実行しているとしましょう。どちらも終了することは期待されておらず、アプリケーションの存続期間中は両方を実行する必要があります。次のようなメインラッパークラスを作成しようとしています。
- いずれかのタスクが例外をスローした場合、ラッパーはそれをキャッチしてタスクを再開します。
- いずれかのタスクが完了するまで実行されると、ラッパーはタスクに気づき、再起動します。
ここで、両方のタスクの実装は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) {}
}
}
}
それは私が望むように振る舞っていますが、私を驚かせるのを待っている落とし穴、非効率性、またはまったく間違った方向性があるかどうかはわかりません。(実際、私はこれに慣れていないので、何か間違っている/望ましくないことがなければ、私はショックを受けるでしょう。)
どんな洞察も歓迎します。