@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

クラスの破棄方法について

1
投稿者投稿内容
ポッキー
会議室デビュー日: 2005/01/26
投稿数: 6
投稿日時: 2005-01-27 11:51
はじめまして。

現在、Threadクラスを使ったプログラムを作成しています。
Threadクラスの中で他のPCに接続に行ったりしているのですが、
たまに処理が戻ってこない場合があります。
この時に、タイムアウトの時間を設定しておいて、その時間内に処理が
戻ってこない場合に、Threadクラスを破棄したいと考えています。
要はC言語のTerminateThreadみたいなことができればいいのですが。

どなたかご存知の方がいらっしゃいましたら、ご回答よろしくお願いします。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-01-27 12:33
私もスレッドプログラミングに詳しいわけではないですが
Thread#destroy()というメソッドがあります。

しかしながら、どうやらJDK5.0から非推奨になっているよう
なので使わない方が良いでしょう。

Threadの中でTimeoutを検知させてreturnさせるとかで良いのでは?
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-01-27 12:50
引用:

現在、Threadクラスを使ったプログラムを作成しています。
Threadクラスの中で他のPCに接続に行ったりしているのですが、
たまに処理が戻ってこない場合があります。
この時に、タイムアウトの時間を設定しておいて、その時間内に処理が
戻ってこない場合に、Threadクラスを破棄したいと考えています。



本スレッドで時限付きのwaitに入って、別スレッドで他PCに接続して待ち。無事に処理が戻ってきたら本スレッド(が入っているウェイトセット)にnotifyAll。
起きた本スレッドはwaitが切れたのかnotifyされたのか分からないので、結果がしかるべきところに格納されているかを判定して、しかるべき処理を行う(タイムアウトしましたor処理結果表示or...etc)。
……とかいうイメージでいかがでしょうか?これなら実装はさほど複雑にならないと思います。

詳しくは結城さんのマルチスレッド本
http://www.amazon.co.jp/exec/obidos/ASIN/4797319127
などをご覧になるとよいかも知れません。

takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2005-01-27 16:18
JRE 1.3 以上で可なら、java.util.Timerクラスを使えば簡単かも。
使用方法は、まずjava.util.TimerTaskを継承したクラスを定義、
コード:

class MyTimerTask extends TimerTask {
    Thread th;
    public MyTimerTask(Thread th) {
        super();
        this.th=th;
    }
    public void run() {
        th.interrupt();
    }
}


コンストラクタ引数として監視対象のスレッドインスタンスを渡すようにしておきます。
次に実際にタイマー機能を付加する方法は、、、

コード:

・・・・・・・・・・・・
・・・・・・・・・・・・
//何某かのスレッドを起動
Thread thread=new Thread(runnable);
thread.start();
//タイマー設定
Timer timer=new Timer(true);
TimerTask task=new MyTimerTask(thread);
timer.schedule(task, 10000); //10秒後に対象のスレッドを停止


例外(InterruptedException)のキャッチ節での後始末を忘れずに。
ポッキー
会議室デビュー日: 2005/01/26
投稿数: 6
投稿日時: 2005-01-31 14:50
(株)ぽちさん、永井和彦さん、takamaroさん、返信ありがとうございます。
とりあえず、takamaroさんの方法で行ないたいと思います。

結果がでましたら、また報告します。
ありがとうございました。
1

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