FC2ブログ
HOME   »  スポンサー広告  »  スポンサーサイト   »  Java  »  [Java]スレッドの終了

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Java]スレッドの終了

マルチスレッド動作時に自スレッド以外のスレッドを終了させたい場合は、ThreadクラスのInterruptメソッドが使用できる。
public class Main {
    public static boolean interrupted;
    public static long startTime;
    public static long interruptedTime;

    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                long referenceTime = startTime;
                long currentTime;
                while (!isInterrupted()) {
                    currentTime = System.currentTimeMillis();
                    if ((currentTime - referenceTime) >= 1000) {
                        referenceTime = currentTime;
                        System.out.println("別スレッド動作中:" + currentTime);
                    }
                }
                interruptedTime = System.currentTimeMillis();
                System.out.println("割り込み:" + interruptedTime);
                interrupted = true;
            }
        };
        interrupted = false;
        startTime = System.currentTimeMillis();
        System.out.println("開始:" + startTime);
        thread.start();
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            System.out.println("メインスレッド動作中:" + System.currentTimeMillis());
        }
        thread.interrupt();
        while (!interrupted) {
        }
        System.out.println("経過時間:" + (interruptedTime - startTime));
    }
}
上記では、メインスレッド、別スレッド双方で開始から1秒周期で「動作中」メッセージを表示し、メインスレッド側で5秒経過(5回目の「動作中」メッセージを表示)したタイミングで別スレッド側のInterruptメソッドを実行している。
別スレッド側では、isInterruptedメソッドで割り込み発生状態(Interruptメソッド実行状態)をチェックし、割り込みが発生していたら(Interruptメソッドが実行され、その結果isInterruptedメソッドの戻り値がtrueとなったら)「割り込み」メッセージ表示後runメソッドを終了する。

実行結果は以下の通りで、開始から約5秒後(約5000ミリ秒後)に割り込みが発生し、そこで別スレッドの動作が終了している。


開始:1330828609421
別スレッド動作中:1330828610421
メインスレッド動作中:1330828610453
別スレッド動作中:1330828611421
メインスレッド動作中:1330828611484
別スレッド動作中:1330828612421
メインスレッド動作中:1330828612484
別スレッド動作中:1330828613421
メインスレッド動作中:1330828613484
別スレッド動作中:1330828614421
メインスレッド動作中:1330828614484
割り込み:1330828614500
経過時間:5079


但し、Interruptメソッドはそれ自体にスレッドを終了させる機能はなく、あくまでもトリガとして機能するだけである(上記でも、Interruptメソッド実行を契機としてwhileループから抜ける様にしている)。

スレッドがsleepメソッド、joinメソッド、waitメソッドを実行中にInterruptメソッドが実行された場合はInterruptedExceptionがスローされる為、これをキャッチすることにより割り込み発生を認識することができる。
public class Main {
    public static boolean interrupted;
    public static long startTime;
    public static long interruptedTime;

    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                while (!isInterrupted()) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        interruptedTime = System.currentTimeMillis();
                        System.out.println("割り込み(InterruptedException):" + interruptedTime);
                        interrupted = true;
                        return;
                    }
                    System.out.println("別スレッド動作中:" + System.currentTimeMillis());
                }
                interruptedTime = System.currentTimeMillis();
                System.out.println("割り込み(isInterrupted):" + interruptedTime);
                interrupted = true;
            }
        };
        interrupted = false;
        startTime = System.currentTimeMillis();
        System.out.println("開始:" + startTime);
        thread.start();
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            System.out.println("メインスレッド動作中:" + System.currentTimeMillis());
        }
        thread.interrupt();
        while (!interrupted) {
        }
        System.out.println("経過時間:" + (interruptedTime - startTime));
    }
}
上記の実行結果は以下の通り(上記もそうだが、runメソッド内にsleepメソッド、joinメソッド、waitメソッド以外の処理内容がある場合は、割り込み発生タイミングによってはInterruptedExceptionがスローされない可能性があることを考慮して、InterruptedExceptionのキャッチと併せてisInterruptedメソッドによる割り込み発生確認も行うべき)。


開始:1330828060578
別スレッド動作中:1330828061609
メインスレッド動作中:1330828061609
別スレッド動作中:1330828062609
メインスレッド動作中:1330828062609
別スレッド動作中:1330828063609
メインスレッド動作中:1330828063609
別スレッド動作中:1330828064609
メインスレッド動作中:1330828064609
別スレッド動作中:1330828065609
メインスレッド動作中:1330828065609
割り込み(InterruptedException):1330828065609
経過時間:5031



関連記事
Comment
参考になりそうですね♪
Trackback
マルチスレッド動作時に自スレッド以外のスレッドを終了させたい場合は、ThreadクラスのInterruptメソッドが使用できる。 public class Main { public static boolean interrupted; public static long startTime; public static long interruptedTim...
Trackback URL
Comment Form
管理者にだけ表示を許可する
プロフィール

まさお

Author:まさお
プログラミングは趣味レベルなので、お手柔らかに。

ブログランキング
ブログランキング参加中。是非クリックお願いします。


にほんブログ村 IT技術ブログ Androidアプリ開発へ

人気ブログランキングへ

ブログランキング



ブログ王

ブログランキング【ブログの惑星】

プログラム人気ブログランキング
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。