- PR -

スレッド制御

1
投稿者投稿内容
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-06-08 13:38
いくつあがっているかは解らないけどスレッドの名前だけはわかっている場合、そのスレッドを制御するには、どのようにアクセスすればよいですか?
やりたいことは、あるアクションで特定のスレッドを殺したいだけなのですが。

また、それはThreadGroupを持たないと実現できないものでしょうか。。。

どなたかご教授ください。

よろしくお願いいたします。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-06-08 13:48
Thread#enumerate(Thread[] tarray)でどうですか。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2005-06-08 14:00
こんな感じのコードを書いたことがあります。

コード:
ThreadGroup tg = Thread.currentThread().getThreadGroup();
int numActiveThreads = (int)Math.ceil(tg.activeCount() * 1.2);
Thread threads[] = new Thread[numActiveThreads];
int numThreads = tg.enumerate(threads);

for (int i = 0; i < numThreads; i ++) {
  if (threads[i].getName().equals("スレッド名")) {
    threads[i].stop();
  }
}


Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-06-08 14:14
シュンさん、早速のレスありがとうございます。
今教わったやりかたを、試しているところです。

結果なのですが
メインスレッドで行ってみたものの、中身がNULLなのです。
使い方が間違っていたようで、配列の数を指定しないといけないようですが。。。
それは不明なのです!
こういう場合はどうすればいいでしょうか。。。

メインといってもRMIでキックしたスレッドですが。。。気になるのはサーバ側は別のVMであらかじめキックしています。そこで、待機状態のスレッドを複数立ち上げている状態でして、今行っているセッションのスレッドではないのです。。。

アクセスできないのでしょうか。。。
そんなことないと思うんですが、なんとか方法があると思うのですが。。。

Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-06-08 14:32
カーにーさん、はじめまして。お付き合いいただいて恐縮です。
カーにーさんに教えていただいたやりかたも早速試しているところです。

スレッド数をおおよそでも設定してしまうというやりかたがあるんですね。。。
stopは推奨されてないとかいうからdestroyを使ってみたんですが、

java.lang.NoSuchMethodError
at java.lang.Thread.destroy(Thread.java:779)
at fec.sb.maintenance.stopapn.FmjStopApnBean.sub_execute(FmjStopApnBean.java:133)
at fec.sb.maintenance.stopapn.FmjStopApnBean.execute(FmjStopApnBean.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:683)
at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:185)
at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:72)
at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:84)

なの出てしまうんです。
コンパイルエラーは特に出てないのに。

これも推奨されないのですかね。。。

stop で試すと。。。いきました!
ありがとうございます!

ということは、最初のスレッドでもないのに、後からできたスレッドは、システムのスレッドを全部把握できてしまえる。。。と判断してもいいってことですよね。。。

間違ってますでしょうか。
すみません、たびたび。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-06-08 14:44
>ということは、最初のスレッドでもないのに、後からできたスレッドは、システム
>のスレッドを全部把握できてしまえる。。。と判断してもいいってことですよね。。。
Thread#enumerate()のAPIドキュメントを読みましょう。

動作しつづけるようなスレッドを安全に停止する作法がありますので、それに従った方
が良いですよ。確かチュートリアルに記述があると思いますが、簡単なので
例を書いてしまいます。
停止したくなったらMyThread#notfyStop()をコールします。

コード:

class MyThread extends Thread{
private volatile boolean isAlive = true;
public void notifyStop(){isAlive = false;}
public void run(){while(isAlive){runImpl();}}
public void runImpl(){/*処理を書く*/}
}



スレッドが外部I/Oなどでブロックしうる実装で、且つその最中に
強制終了したい場合には、NIOのInterruptibleChannelと
Thread#interrupt()を組み合わせると良いでしょう。

[ メッセージ編集済み 編集者: シュン 編集日時 2005-06-08 14:49 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-06-09 12:45
引用:

スレッド数をおおよそでも設定してしまうというやりかたがあるんですね。。。
stopは推奨されてないとかいうからdestroyを使ってみたんですが、



Thread.destroy()は未実装のはずです。

Thread.destroy()のAPIリファレンスを見ましょう。
ちゃんと理由までかかれていますよ。

引用:

Deprecated. This method was originally designed to destroy this thread without any cleanup. Any monitors it held would have remained locked. However, the method was never implemented. If if were to be implemented, it would be deadlock-prone in much the manner of suspend(). If the target thread held a lock protecting a critical system resource when it was destroyed, no thread could ever access this resource again. If another thread ever attempted to lock this resource, deadlock would result. Such deadlocks typically manifest themselves as "frozen" processes. For more information, see Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.

Throws NoSuchMethodError.

Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-06-09 14:56
かずくんさん、はじめまして。レスありがとうございます。
了解いたしました。そうでしたね。。。すみません。

シュンさん
ありがとうございます。
教えていただいたやりかたは、まだ試していませんが、そのうち使う時がくるかもしれません。ただいま別の問題を抱えており、一時中断状態になってしまいました。

もう少し追っていきたい問題がまだあるにはあるのですが、そのときにまたよろしくおねがいします。



1

スキルアップ/キャリアアップ(JOB@IT)