JAvaスレッドのステータスと例


Threadのstartとrun
1) start:
startメソッドでスレッドを起動し、本当にマルチスレッド実行を実現した場合、runメソッドボリュームコードの実行が完了するのを待つことなく、次のコードを直接実行し続けます.Threadクラスのstart()メソッドを呼び出してスレッドを起動すると、このスレッドは準備完了(実行可能)状態で実行されず、spuタイムスライスが得られるとrun()メソッドが実行され始めます.ここでメソッドrun()はスレッド体と呼ばれ、実行するスレッドの内容が含まれています.Runメソッドの実行が終了すると、このスレッドは終了します.
2) run:
run()メソッドはクラスの一般的なメソッドにすぎません.Runメソッドを直接呼び出すと、プログラムにはメインスレッドというスレッドしかありません.プログラムの実行パスは1つしかありません.順序で実行するか、runメソッド体の実行が完了してから次のコードを実行するかを待つかで、スレッドを書く目的を達成できません.
まとめ:startメソッドを呼び出すとスレッドを起動できますが、runメソッドはthreadの一般的なメソッド呼び出しにすぎません.メインスレッドで実行されます.
public class SMSSample implements Runnable {

	public static void main(String[] args) {
	new SMSSample().multiThreadSendMsg(); //          
	}
}

	//          
	public void multiThreadSendMsg() {
		int threadCount =150; //         
		Runnable target = new SMSSample();
		long start = System.currentTimeMillis();
		for (int i = 0; i < threadCount; i++) {

			Thread thread = new Thread(target);
			thread.setName("Thead-Call-SMSSample-"+i);
			System.out.println("---------      :" + thread.getName());
			System.out.println("---------   ID :" + thread.getId());
			thread.start();

		}
		}
		
	}


@Override
	public void run() {
	   context;
	try {
		while(canStart){  }
	}catch (Exception e) {
	e.p...
	}
	}

-void notifyAll():このオブジェクトで待機しているすべてのスレッドを起動します.
-void wait():起動しない限り、スレッドを待機状態にします.
-void wait(long timeout):スレッドをtimeoutが指定したミリ秒数まで待機させます.待機時間が満了したり、起動されたりすると、スレッドはスレッドスケジューラに再スケジュールされます.timeoutが0の場合、wait()に等しい.
—  Thread.sleep():実行中のスレッドがThreadクラスのsleep()メソッドを呼び出すと、スレッドはメソッドパラメータで指定された期間内にスリープ状態になります.つまり、実行リソースを解放せずに実行を停止します.スリープ時間が終了すると、またはThreadのためにキャプチャして応答する.interrupt()メソッドによるInterruptedException異常の後、スレッドは実行状態に戻ります.
---------------------------------------------------
スレッドのステータス
スレッドは、作成、準備、実行、スリープ、保留、死亡などのタイプに分けることができます.異なるタイプのスレッド状態において、スレッドの特徴は以下の通りである.
-作成ステータス:newキーを使用してスレッドオブジェクトインスタンスを作成すると、オブジェクトインスタンスとしてのみ存在し、JVMはCPUタイムスライスなどの実行リソースを割り当てていません.
-準備完了ステータス:作成中のスレッドに対してThreadクラスのstart()メソッドを呼び出し、スレッドのステータスを準備完了ステータスに変換します.このとき,スレッドは既にCPUタイムスライス以外のシステムリソースを得ており,JVMのスレッドスケジューラがスレッドの優先度に従ってそのスレッドをスケジューリングするだけで,そのスレッドにCPUタイムスライスを得る機会を持たせる.
-運転状態:JVMのスレッドスケジューラは準備完了のスレッドを選択し、CPUタイムスライスを取得させる.
-スリープ状態:スレッド実行中にThreadクラスのsleep()メソッドを呼び出し、メソッドパラメータでスレッドのスリープ時間を指定してスレッドのステータスをスリープ状態に変換します.このとき,このスレッドは指定されたスリープ時間内に占有リソースを解放せずに実行を停止する.時間が到着すると、スレッドは再び実行状態に入ります.スリープ状態のスレッドはjavaに遭遇する可能性がある.lang.InterruptedException異常により、休止を余儀なくされた.
-保留ステータス:スレッドのステータスは、Threadクラスのsuspend()メソッドを呼び出して保留ステータスに変換できます.このとき、スレッドは、使用されたすべてのリソースを解放し、アプリケーションがThreadクラスのresume()メソッドを呼び出してスレッドの実行を再開するまで、JVMスケジューリングによって一時的な記憶領域に転送します.
-デッドステート:スレッドボディの実行が終了するか、スレッドオブジェクトのThreadクラスのstop()メソッドを呼び出すと、スレッドは実行を終了し、JVMによってスレッドによって使用されたリソースが回収されます.
—  Thread.yield():実行中のスレッドがThreadクラスのyield()メソッドを呼び出すと、スレッドが持つCPUタイムスライスが剥奪され、再び準備状態に戻り、JVMスレッドスケジューラのスケジューリングを待つ.
—  Thread.sleep():実行中のスレッドがThreadクラスのsleep()メソッドを呼び出すと、スレッドはメソッドパラメータで指定された期間内にスリープ状態になります.つまり、実行リソースを解放せずに実行を停止します.スリープ時間が終了すると、またはThreadのためにキャプチャして応答する.interrupt()メソッドによるInterruptedException異常の後、スレッドは実行状態に戻ります.
—  Object.wait():実行中のスレッドがObjectクラスのwait()メソッドを呼び出した後、スレッドはメソッドパラメータが指定した期間内に、実行状態を保持したまま準備状態に戻ります.Objectクラスのwait()メソッドは、非参照呼び出しをサポートし、実行を停止し、Objectを待つことを示す.notify()メソッドが起動します.
—  Object.notify():スレッドが準備完了(待機)状態でない場合、Objectクラスを呼び出すnotify()メソッドは機能しません.そうでない場合、スレッドは競合するCPUタイムスライスの資格を再取得し、待機前のステータスポイントから実行します.
—  Thread.stop():スレッドを終了し、スレッドは占有するすべてのリソースを解放します.このメソッドは無効になっています.
—      Thread.join():スレッドを終了し、メソッドパラメータが指定した期間を待つ.待機中にスレッドが終了した場合は、すぐに戻ります.Thread.join()メソッドは推奨されるエンドスレッドのメソッドです.
—     Thread.suspend()、Thread.resume()、Thread.stop()メソッドは無効になっているため、スレッドのステータスは実際には5つしかありません.作成、準備、実行、スリープ、死亡です.
スレッドの待機と起動
スレッドの実行を中断する、準備完了状態を返す手段はjavaを呼び出すことである.lang.Objectオブジェクトのwait()メソッド;待機状態にあるスレッドを起動する手段はjavaを呼び出すことである.lang.Objectオブジェクトのnotify()メソッド.wait()およびnotify()メソッドについて以下に説明する.
-void wait():起動しない限り、スレッドを待機状態にします.
-void wait(long timeout):スレッドをtimeoutが指定したミリ秒数まで待機させます.待機時間が満了したり、起動されたりすると、スレッドはスレッドスケジューラに再スケジュールされます.timeoutが0の場合、wait()に等しい.
-void wait(long timeout,int nanos):timeoutが指定したミリ秒数+nanosが指定したマイクロ秒数までスレッドを待機させます.待機時間が満了したり、起動されたりすると、スレッドはスレッドスケジューラに再スケジュールされます.timeoutとnanosがともに0の場合、wait()に等しい.
-void notify():このオブジェクトで待機しているスレッドを起動し、このオブジェクトで複数のスレッドが同時に待機している場合は、いずれかを起動します.
-void notifyAll():このオブジェクトで待機しているすべてのスレッドを起動します.
スレッドのスリープと中断
スレッドのスリープ状態と準備(待機を含む)状態の違いは、スリープ状態にあるスレッドは実行リソースを解放しないことであり、スリープ終了後、JVMスレッドスケジューラに再度選択されるのを待つことなく、直接実行状態に入ることができることである.スリープ状態を終了するには、(1)スリープ時間が到着した後、スレッドが再び実行状態に入ること.(2)スリープ状態のスレッドがjava.lang.InterruptedException異常に遭遇し、スリープを停止させられる.
現在のスレッドをスリープ状態にする手段は、Threadクラスのsleep()メソッドを呼び出すことであり、このメソッドは静的メソッドであり、これは、Threadオブジェクトを指定することなく直接使用できることを意味する.あるスレッドのスリープ状態を中断する手段は、そのスレッドオブジェクトを呼び出すinterrupt()メソッドである.sleep()およびinterrupt()メソッドについて以下に説明する.
-void sleep(long timeout):現在のスレッドをtimeoutで指定したミリ秒数だけスリープさせます.スリープ中に割り込みが発生した場合、InterruptedException異常を放出します.
-void sleep(long timeout,int nanos):現在のスレッドをtimeoutで指定したミリ秒数+nanosで指定したマイクロ秒数だけスリープさせます.スリープ中に割り込みが発生した場合、InterruptedException異常を放出します.
-void interrupt():スレッドの休止状態を中断します.
スレッドの終了
実行中のスレッドを終了する場合、Threadクラスはもともとスレッドを停止する方法:stop()を提供していたが、この方法は固有の不安全性を有していることが実証され、廃棄された.現在私たちが身につけているスキルと結びつけて、スレッドを完璧に終了することができます.それは、スレッドのスリープと割り込みメカニズムを利用して、サブスレッドの中でスケジューリングスレッド(例えば、スレッドを作成するメインスレッド)のために割り込み機会を意図的に手配することです.
スレッドのスリープと中断メカニズムを利用して,残さずにスレッドを完璧に終了させることが,スレッドを終了させる推奨方法である.インスタンスは簡単ですが、より複雑なシーンでは、このモデルに従ってスレッドの終了メカニズムを設計することもできます.
スレッドの終了に関連するメソッドでは、Threadクラスは、スレッドの終了を待つ一連のjoin()メソッドも提供する.join()メソッドは、スレッドを終了するのではなく、現在のスレッドをブロックし、スレッドの終了を待つ方法を提供します.join()メソッドについて以下に説明する.
-void join():現在のスレッドをブロックし続け、スレッドの終了を待つ.待機中に割り込み要求が発生した場合、InterruptedException例外が放出されます.
-void join(long timeout):timeoutが指定したミリ秒時間内に現在のスレッドをブロックし、スレッドの終了を待つ.待機中に割り込み要求が発生した場合、InterruptedException例外が放出されます.
-void join(long timeout,int nanos):timeoutが指定したミリ秒+nanosが指定したマイクロ秒時間内に現在のスレッドをブロックし、スレッドの終了を待つ.待機中に割り込み要求が発生した場合、InterruptedException例外が放出されます.