この章に関係する内容は次のとおりです。
1。スリープの紹介()
2。sleep()の例
3。睡眠()とwait()の比較
1。スリープの紹介()
sleep()はthread.javaで定義されています。
Sleep()の機能は、現在のスレッドを睡眠にすることです。つまり、現在のスレッドは「ランニング状態」から「睡眠(ブロッキング)状態」に入ります。 Sleep()はスリープ時間を指定し、スレッドスリープ時間はスリープ時間よりも大きくなります。実行する予定のCPU。
2。sleep()の例
以下は、睡眠の使用を実証する簡単な例です()。
コードコピーは次のとおりです。
// sleeptest.javaのソースコード
クラスのthreadaはスレッドを拡張します{
public threada(string name){
super(name);
}
public同期void run(){
試す {
for(int i = 0; i <10; i ++){
System.out.printf( "%s:%d/n"、this.getName()、i);
//私が4で分割できるとき、100ミリ秒間寝る
if(i%4 == 0)
thread.sleep(100);
}
} catch(arternedexception e){
e.printstacktrace();
}
}
}
パブリッククラスのスリープテスト{
public static void main(string [] args){
threada t1 = new Streada( "T1");
t1.start();
}
}
実行結果:
コードコピーは次のとおりです。
T1:0
T1:1
T1:2
T1:3
T1:4
T1:5
T1:6
T1:7
T1:8
T1:9
結果説明:
プログラムは比較的簡単です。メインスレッドメインのスレッドT1を開始します。 T1が開始された後、T1の計算Iが4で割り切れることができる場合、T1はthread.sleep(100)を介して100ミリ秒間眠ります。
sleep()とwait()の比較
wait()の関数は、現在のスレッドが「running状態」から「wait(blocking)状態を入力し、同期ロックを解放できるようにすることであることがわかります。 Sleep()の機能は、現在のスレッドが「ランニング状態」から「睡眠(ブロック)状態」に入ることです。
ただし、wait()はオブジェクトの同期ロックを解放しますが、sleep()はロックを放出しません。
次の例は、Sleep()がロックを放出しないことを示しています。
コードコピーは次のとおりです。
// SleepLockTest.javaのソースコード
パブリッククラスのsleeplocktest {
private staticオブジェクトobj = new object();
public static void main(string [] args){
threada t1 = new Streada( "T1");
threada t2 = new Streada( "T2");
t1.start();
t2.start();
}
静的クラススレッドはスレッドを拡張します{
public threada(string name){
super(name);
}
public void run(){
// OBJオブジェクトの同期ロックを取得します
同期(obj){
試す {
for(int i = 0; i <10; i ++){
System.out.printf( "%s:%d/n"、this.getName()、i);
//私が4で分割できるとき、100ミリ秒間寝る
if(i%4 == 0)
thread.sleep(100);
}
} catch(arternedexception e){
e.printstacktrace();
}
}
}
}
}
実行結果:
コードコピーは次のとおりです。
T1:0
T1:1
T1:2
T1:3
T1:4
T1:5
T1:6
T1:7
T1:8
T1:9
T2:0
T2:1
T2:2
T2:3
T2:4
T2:5
T2:6
T2:7
T2:8
T2:9
結果説明:
2つのスレッドT1とT2がメインスレッドメインで開始されます。 T1とT2は、run()、つまり同期(OBJ)の同じオブジェクトの同期ロックを参照します。 T1ランニング中、swree.sleep(100)を呼び出します。 T1は「OBJが保持している同期ロック」をリリースしないためです!
同期(OBJ)をコメントしてプログラムを再度実行すると、T1とT2を互いに切り替えることができることに注意してください。コメントチューンが同期した後のソースコード(OBJ)は次のとおりです。
コードコピーは次のとおりです。
// sleeplocktest.javaソースコード(commented out synchronized(obj))
パブリッククラスのsleeplocktest {
private staticオブジェクトobj = new object();
public static void main(string [] args){
threada t1 = new Streada( "T1");
threada t2 = new Streada( "T2");
t1.start();
t2.start();
}
静的クラススレッドはスレッドを拡張します{
public threada(string name){
super(name);
}
public void run(){
// OBJオブジェクトの同期ロックを取得します
//同期(obj){
試す {
for(int i = 0; i <10; i ++){
System.out.printf( "%s:%d/n"、this.getName()、i);
//私が4で分割できるとき、100ミリ秒間寝る
if(i%4 == 0)
thread.sleep(100);
}
} catch(arternedexception e){
e.printstacktrace();
}
//}
}
}
}