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

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

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

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

Q&A

解決済

3回答

9328閲覧

JAVAで、名前をつけたThreadが起動しているかを確認する方法

tamogi

総合スコア72

Java

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

0グッド

0クリップ

投稿2016/01/14 14:09

編集2016/01/14 14:31

Javaで様々な名前をつけてThreadを起動し、起動元のクラスから
そのスレッドがまだ実行されているかをTread名だけで確認する方法を教えてください。

java

1public static void main(String args[]){ 2 //スレッドを起動する 3 theadStart(args[0]); 4 5 //いろいろ処理する 6 7 // さっきのスレッドが起動しているかをThread名から確かめたい 8 if(ここに書く条件を知りたい){ 9 //起動していた場合の処理 10 } 11 12} 13 14private void theadStart(String thName){ 15 Thread th = new Thread(); 16 17 //スレッドの名前を設定 18 th.setName(thName); 19 20 th.start(); 21}

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

ThreadMXBean#getThreadInfoを使っても、取得することはできます。

threadNameに探したいスレッド名が入っている前提で、
以下の様にすればスレッドが生きていることが分かります。

ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); int[] ids = threadBean.getAllThreadIds(); ThreadInfo[] threads = threadBean.getThreadInfo(ids, 0); for (ThreadInfo info: threads) { if(thread != null && info.getThreadName().equals(threadName)) { System.out.println(threadName + " is alive."); } }

ThreadGroupは関係ないので、コードとしてはThreadGroup#enumerateより単純にはなります。
また、その他色々な情報が取得できるので有用です。
ただし、この方法ではThreadのインスタンスは取得できないので、
Threadに対して何かしたい場合は、ThreadGroup#enumerateによる方法の方が適切です。

投稿2016/01/15 13:37

eripong

総合スコア1546

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

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

tamogi

2016/01/27 05:00

回答有り難うございました。参考にさせていただきます。
guest

0

ThreadGroup#enumerateを使ってスレッドの配列を取り出すことができます。
mainスレッドのスレッドグループの親のシステムスレッドグループを取得して、そのすべての子スレッドを取得します。
注:mainスレッド以外で実行する場合(サーブレットなど)は、もうすこし工夫が要ります。

スレッドグループはツリー状のデータ構造になっているため、すべてのスレッドグループをたどるのは効率が悪いと思われますのでご注意ください。

例:

lang

1// スレッド1を起動 2final String thread1Name = "mythread1"; 3Thread thread1 = new Thread(() -> { 4 // スレッドが終了すると居なくなるので無限ループで常駐させる 5 while (true) { 6 try { 7 Thread.sleep(1000L); 8 } catch (Exception e) { 9 throw new RuntimeException(e); 10 } 11 } 12}); 13thread1.setName(thread1Name); 14thread1.start(); 15 16// 名前でスレッド1を探す 17// mainスレッドで実行する前提 スレッドグループの階層が深い場合はこれではダメ 18ThreadGroup systemThreadGroup = Thread.currentThread().getThreadGroup().getParent(); 19Thread[] threads = new Thread[systemThreadGroup.activeCount()]; 20systemThreadGroup.enumerate(threads, true); 21for (Thread thread : threads) { 22 if (thread != null && thread.getName().equals(thread1Name)) { 23 System.out.printf("%s, alive=%s%n", thread, thread.isAlive()); 24 } 25}

...

参考リンク:

Javaにおいて、Thread名で指定したスレッドを取得する方法を教えて... - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1333999833

Javaのシステムスレッドについて調べてみた (Java8) - argius note
http://argius.hatenablog.jp/entry/2014/12/16/142115

投稿2016/01/15 12:22

argius

総合スコア9388

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

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

0

一応isAlive()メソッドでその判定は可能です。

java

1if(th1.isAlive()){ 2 //起動していた場合の処理 3}

ただし、この条件分岐であなたの示すelseのコードは実行できません。
なぜなら、Threadは使いきりだからです。
一度終了したThreadを使いまわそうとすると例外が発生します。


そういうことだとしたら、Threadをリスト化するという方法になるのでしょうか?
仕様を考えると、Mapが適しているかもしれません。

java

1Map<String, Thread> threads = new HashMap<String, Thread>(); 2 3//スレッドを起動したあと、起動したスレッドをマップに入れ込む 4threads.put("name", th1); 5 6//当該名前のスレッドが実行中かどうか 7Thread target = threads.get("name"); 8if(target != null && target.isAlive){ 9 //処理 10}

投稿2016/01/14 14:14

編集2016/01/14 14:49
swordone

総合スコア20651

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

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

tamogi

2016/01/14 14:32

回答頂きありがとうございます。 質問の意図が伝わりにくかったので質問文を修正しました。 スレッド名のみで起動確認するやり方があれば教えて頂きたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問