Javaで子スレッドの異常を親スレッドで検知し、その際に、他の子スレッドをを終了するプログラムを作成したいと考えています。
具体的には
クラスAで、複数の子スレッドを作成します。この子スレッドのいずれかで、エラー(Exception)が発生した場合に、他の子スレッドも終了するプログラムを作成したいと考えてます。
・子スレッドの異常の検知
・子スレッドの終了
で良い方法があれば、ご教授いただけないでしょうか。
A-pZが👍を押しています
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
- 子Threadに実行状態を示すboolean値を持たせる(参考→4.4. スレッドを停止させるには)
- 実行する子ThreadをList化する
- 各ThreadにUncaughtExceptionHandlerを設定し、その中でList内の各Threadを止める処理をする(参考→6.3. キャッチされない例外の取得)
こういうのはどうでしょう?
投稿2016/12/02 00:48
総合スコア20651
0
ベストアンサー
以下のようにするとそのような動きができるのではないかと思います
java
1public class OPD { 2 3 static A11 as = null; 4 static A12 as2 = null; 5 static A13 as3 = null; 6 7 public static void main(String[] args) { 8 9 as = new A11(); 10 as2 = new A12(); 11 as3 = new A13(); 12 13 as.start(); 14 as2.start(); 15 as3.start(); 16 17 } 18 19} 20 21class A11 extends Thread { 22 23 public void run() { 24 try { 25 for (int a = 0; a < 10; a++) { 26 System.out.println("down1:" + a); 27 28 Thread.sleep(1000); 29 30 } 31 } catch (Exception e) { 32 33 OPD.as2.stop(); 34 OPD.as3.stop(); 35 36 } 37 38 } 39 40} 41 42class A12 extends Thread { 43 public void run() { 44 try { 45 for (int a = 0; a < 10; a++) { 46 System.out.println("down2:" + a); 47 if (a == 5) { 48 System.out.println("error all thread stop"); 49 50 throw new Exception(); 51 52 } 53 54 Thread.sleep(1000); 55 56 } 57 58 } catch (Exception e) { 59 OPD.as.stop(); 60 OPD.as3.stop(); 61 62 } 63 } 64 65} 66 67class A13 extends Thread { 68 public void run() { 69 try { 70 for (int a = 0; a < 10; a++) { 71 System.out.println("down3:" + a); 72 73 Thread.sleep(1000); 74 75 } 76 } catch (Exception e) { 77 78 OPD.as2.stop(); 79 OPD.as.stop(); 80 81 } 82 } 83 84}
コメントの訂正により親スレッドで感知して反応するようにしたものが以下です
java
1public class OPD { 2 3 static A11 as = null; 4 static A12 as2 = null; 5 static A13 as3 = null; 6 7 public static void main(String[] args) { 8 9 as = new A11(); 10 as2 = new A12(); 11 as3 = new A13(); 12 13 as.start(); 14 as2.start(); 15 as3.start(); 16 while (true) { 17 18 if (A12.running == false || A13.running == false 19 || A11.running == false) { 20 A12.running = false; 21 A13.running = false; 22 A11.running = false; 23 break; 24 } 25 26 } 27 28 } 29 30} 31 32class A11 extends Thread { 33 34 static boolean running = true; 35 36 public void run() { 37 try { 38 for (int a = 0; a < 10; a++) { 39 if (running == false) 40 return; 41 System.out.println("down1:" + a); 42 43 Thread.sleep(1000); 44 45 } 46 return; 47 } catch (Exception e) { 48 running = false; 49 50 return; 51 52 } 53 54 } 55 56} 57 58class A12 extends Thread { 59 static boolean running = true; 60 61 public void run() { 62 try { 63 for (int a = 0; a < 10; a++) { 64 if (running == false) 65 return; 66 System.out.println("down2:" + a); 67 if (a == 5) { 68 System.out.println("error all thread stop"); 69 70 throw new Exception(); 71 72 } 73 74 Thread.sleep(1000); 75 76 } 77 return; 78 79 } catch (Exception e) { 80 running = false; 81 return; 82 } 83 } 84 85} 86 87class A13 extends Thread { 88 static boolean running = true; 89 90 public void run() { 91 try { 92 for (int a = 0; a < 10; a++) { 93 if (running == false) 94 return; 95 System.out.println("down3:" + a); 96 97 Thread.sleep(1000); 98 99 } 100 return; 101 } catch (Exception e) { 102 running = false; 103 104 return; 105 106 } 107 108 } 109 110} 111
投稿2016/12/01 23:41
編集2016/12/02 00:10退会済みユーザー
総合スコア0
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/07 00:45