スレッドハングが便利な場合があります。たとえば、別のスレッドを使用して、時刻を表示できます。ユーザーがクロックを使用したくない場合、スレッドは中断されます。いずれにせよ、スレッドの一時停止は非常に単純であり、一時停止すると、スレッドを再起動することも簡単な問題です。
スレッドの一時停止、終了、復元のメカニズムは、Java 2以前のバージョンで異なります。 Java 2を使用してコードを作成しますが、初期のJava環境でこれらの操作がどのように行われたかを理解する必要があります。たとえば、古いコードを更新または維持する必要がある場合があります。また、Java 2にそのような変更がある理由を理解する必要があります。これらの理由から、以下は、スレッドコントロールを実行する元の方法を説明し、その後にJava 2メソッドを説明します。
Java 1.1以前のスレッドの一時停止、回復、および終了
Java2バージョンの前に、プログラムはスレッド定義のsuspend()とresume()を使用してスレッドを一時停止および再起動します。彼らは次の形であります:
最終void suspend()final void resume()
次の手順では、これらの方法について説明します。
// suspend()とclass newthreadはrunnable {sward thread t; out .println( " + t); i> 0; system.out.println(name + " + i); ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づく::::::::::::) new thrired(new the new -thread( "2); .Sleep(1000);スリープ(1000);スレッドが終了するのを待ちます{system.out.println( "ob2.t.join(); println( "メインスレッドが中断されました");プログラムの出力の一部は次のとおりです。
新しいスレッド:スレッド[1、5、メイン] 1つ:15Newスレッド:スレッド[2、5、メイン] 2:15ONE:14TWO:14ONE:13TWO:13ONE:12TWO:11TWO:11SUSPENDING THERD ONETWO:10TWO:8TWO: 7two:6レッジングスレッド1つのスレッドスレッド2Oone:10one:9one:8one:7one:6 Resuming Thread twowaiting for two for two:5one:5two:4one:4two:3one:3 2:2One:2two:1one:1two exiting.one .mainスレッドの終了。
スレッドクラスは、stop()を定義してスレッドを終了します。そのフォームは次のとおりです。
void stop()
スレッドが終了すると、resume()が実行して実行を続けることはできません。
Javaのスレッドを一時停止、復元、終了します
Thread-defined Suspend()、Resume()、およびStop()メソッドは、スレッドを管理するための完璧で便利な方法であるように思われ、新しいJavaバージョンのプログラムでは使用できません。ここに理由があります。 suspend()は、suspend()が深刻なシステム障害を引き起こす可能性があるため、java2ではsuspend()メソッドが好まれていません。重要なデータ構造のスレッドがロックされていると仮定すると、スレッドがそこに吊り下げられている場合、ロックされたスレッドはリソースの制御を放棄しません。これらのリソースを待っている他のスレッドがデッドロックされる可能性があります。
resume()メソッドも承認されていません。問題を引き起こすことはありませんが、Suspend()メソッドなしでは独立して使用することはできません。スレッドクラスのstop()メソッドもJava 2で反対しています。これは、この方法が深刻なシステム障害を引き起こす可能性があるためです。スレッドが正確で重要なデータ構造を作成し、その1つの割合のみを完了していることを想像してください。この時点でスレッドが終了した場合、データ構造はクラッシュ状態のままである可能性があります。
Java 2では、suspend()、resume()、およびstop()メソッドを使用してスレッドを制御できないため、スレッドを停止、復元、終了する方法はないと思うかもしれません。実際、そうではありません。代わりに、スレッドは定期的にチェックするように設計する必要があります。スレッドを一時停止するか、再開または独自の実行を終了するかを判断する必要があります。表現的に、これはスレッドの状態を示すフラグ変数を確立することによって行われます。フラグが「実行」に設定されている限り、run()メソッドはスレッドで実行され続ける必要があります。フラグが「一時停止」している場合、スレッドは一時停止する必要があります。 「停止」に設定する場合、スレッドを終了する必要があります。
もちろん、そのようなコードを書くには多くの方法がありますが、中心的なトピックはすべてのプログラムで同じでなければなりません。
次の例は、オブジェクトから継承されたwait()およびnotify()メソッドがスレッドの実行をどのように制御するかを示しています。この例は、前述のプログラムに非常に似ています。ただし、承認されていない方法はどれも有用ではありません。プログラムの実行について考えてみましょう。
NewTRIEDクラスには、スレッドの実行を制御するために使用されるインスタンス変数SuspendFlagが含まれています。コンストラクターによってFalseに初期化されます。 run()メソッドには、suspendflagの同期宣言を監視するブロックが含まれています。変数がtrueの場合、wait()メソッドが呼び出され、スレッドが一時停止されます。 mySuspend()メソッドは、suspendflagをtrueに設定します。 myResume()メソッドは、suspendflagをfalseに設定し、notify()メソッドを呼び出してスレッドを呼び起こします。最後に、mysuspend()およびmyresume()メソッドを呼び出すようにmain()メソッドが変更されます。
// java2classのスレッドのrunnable {Sthreas suspendflag(streadname); out .println( " + t); T i = 15; }} catch(interrumedexception {system.out.println(furtreded "); void myresume(){suspendflag = false; ;スレッド(1000)を試してくださいスレッド1 "); ob2.mysuspend(); system.out.println(" suspending thread two "); shood.sleep(1000); ob2.myresume(); system.out.println(" Resuming thread t wo ") ;} catch(system.out.println( "メインスレッドが中断されました")。 T.Join(); }このプログラムの出力は、以前のプログラムの出力と同じです。この本の後半では、Java 2メカニズムを使用してスレッドを制御する例をもっと見ることができます。このメカニズムは古い方法ほど「クリーン」ではありませんが、実行時にエラーが発生しないようにする方法です。これは、すべての新しいコードを取得しなければならない方法です。