質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

6012閲覧

Javaで子スレッドの異常を検知し、他スレッドを終了

Jackest

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2016/12/01 23:15

Javaで子スレッドの異常を親スレッドで検知し、その際に、他の子スレッドをを終了するプログラムを作成したいと考えています。

具体的には
クラスAで、複数の子スレッドを作成します。この子スレッドのいずれかで、エラー(Exception)が発生した場合に、他の子スレッドも終了するプログラムを作成したいと考えてます。

・子スレッドの異常の検知
・子スレッドの終了

で良い方法があれば、ご教授いただけないでしょうか。

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

  1. 子Threadに実行状態を示すboolean値を持たせる(参考→4.4. スレッドを停止させるには)
  2. 実行する子ThreadをList化する
  3. 各ThreadにUncaughtExceptionHandlerを設定し、その中でList内の各Threadを止める処理をする(参考→6.3. キャッチされない例外の取得)

こういうのはどうでしょう?

投稿2016/12/02 00:48

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jackest

2016/12/07 00:45

教えて頂いた方法で対処できました。ありがとうございました。
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jackest

2016/12/01 23:51

言葉不足でした。 親スレッド(呼び出し元)で、子スレッドの異常を検知し 他の子スレッドを終了させてたい考えです。 可能であれば、非推奨メソッド「stop();」は利用しない事が望ましいです。
Jackest

2016/12/07 00:45

教えて頂いた方法で対処できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問