Javaスレッドが休眠します動力ノードJava学院の整理
sleep()紹介
sleep()は、Thread.javaに定義されている。
sleep()の役割は、現在のスレッドを休止させることであり、現在のスレッドは「運転状態」から「休止(ブロッキング)状態」に遷移することである。sleep()はスリープ時間を指定します。スレッドの休止時間はスリープ時間より大きいです。スレッドが再起動されると、「ブロック状態」から「準備状態」になり、cpuのスケジュール実行を待つことになります。
sleep()例
sleep()の使い方を簡単な例で説明します。
t 1:0
t 1:1
t 1:2
t 1:3
t 1:4
t 1:5
t 1:6
t 1:7
t 1:8
t 1:9
結果説明:
プログラムは比較的簡単で、メインスレッドmainでスレッドt 1を起動します。t 1が起動した後、t 1の計算iが4で割り切れると、t 1は、Thread.sleep(100)を介して100ミリ秒スリープする。
sleep()とwait()の比較
wait()の役割は、現在のスレッドを「運転状態」から「待ち(ブロック)状態」にすると同時に、同期ロックが解除されることを知っています。sleep()の役割は、現在のスレッドを「運転状態」から「休止(ブロッキング)状態」にすることです。
ただし、wait()は対象の同期ロックを解除しますが、sleep()はロックを解除しません。
以下では例示的にsleep()がロックを解除しないことを示している。
t 1:0
t 1:1
t 1:2
t 1:3
t 1:4
t 1:5
t 1:6
t 1:7
t 1:8
t 1:9
t 2:0
t 2:1
t 2:2
t 2:3
t 2:4
t 2:5
t 2:6
t 2:7
t 2:8
t 2:9
結果説明:
メインスレッドmainでは、2つのスレッドt 1とt 2が起動されている。t 1とt 2は、同じオブジェクトの同期ロック、すなわち、synchronized(obj)を、run()に引用する。t 1の運転中、Thread.sleep(100)を呼び出すが、ただし、t 2はcpu実行権を取得しない。なぜなら、t 1は「Objが持つ同期ロック」を解放していないからである。
なお、私たちがsynchronized(obj)を注釈して再度実行すれば、t 1とt 2は互いに切り換えることができる。以下はコメント調のsynchronizedのソースコードです。
sleep()は、Thread.javaに定義されている。
sleep()の役割は、現在のスレッドを休止させることであり、現在のスレッドは「運転状態」から「休止(ブロッキング)状態」に遷移することである。sleep()はスリープ時間を指定します。スレッドの休止時間はスリープ時間より大きいです。スレッドが再起動されると、「ブロック状態」から「準備状態」になり、cpuのスケジュール実行を待つことになります。
sleep()例
sleep()の使い方を簡単な例で説明します。
// SleepTest.java
class ThreadA extends Thread{
public ThreadA(String name){
super(name);
}
public synchronized void run() {
try {
for(int i=0; i <10; i++){
System.out.printf("%s: %d
", this.getName(), i);
// i 4 , 100
if (i%4 == 0)
Thread.sleep();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class SleepTest{
public static void main(String[] args){
ThreadA t1 = new ThreadA("t1");
t.start();
}
}
実行結果: t 1:0
t 1:1
t 1:2
t 1:3
t 1:4
t 1:5
t 1:6
t 1:7
t 1:8
t 1:9
結果説明:
プログラムは比較的簡単で、メインスレッドmainでスレッドt 1を起動します。t 1が起動した後、t 1の計算iが4で割り切れると、t 1は、Thread.sleep(100)を介して100ミリ秒スリープする。
sleep()とwait()の比較
wait()の役割は、現在のスレッドを「運転状態」から「待ち(ブロック)状態」にすると同時に、同期ロックが解除されることを知っています。sleep()の役割は、現在のスレッドを「運転状態」から「休止(ブロッキング)状態」にすることです。
ただし、wait()は対象の同期ロックを解除しますが、sleep()はロックを解除しません。
以下では例示的にsleep()がロックを解除しないことを示している。
// SleepLockTest.java
public class SleepLockTest{
private static Object obj = new Object();
public static void main(String[] args){
ThreadA t1 = new ThreadA("t1");
ThreadA t2 = new ThreadA("t2");
t1.start();
t2.start();
}
static class ThreadA extends Thread{
public ThreadA(String name){
super(name);
}
public void run(){
// obj
synchronized (obj) {
try {
for(int i=0; i <10; i++){
System.out.printf("%s: %d
", this.getName(), i);
// i 4 , 100
if (i%4 == 0)
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
実行結果:t 1:0
t 1:1
t 1:2
t 1:3
t 1:4
t 1:5
t 1:6
t 1:7
t 1:8
t 1:9
t 2:0
t 2:1
t 2:2
t 2:3
t 2:4
t 2:5
t 2:6
t 2:7
t 2:8
t 2:9
結果説明:
メインスレッドmainでは、2つのスレッドt 1とt 2が起動されている。t 1とt 2は、同じオブジェクトの同期ロック、すなわち、synchronized(obj)を、run()に引用する。t 1の運転中、Thread.sleep(100)を呼び出すが、ただし、t 2はcpu実行権を取得しない。なぜなら、t 1は「Objが持つ同期ロック」を解放していないからである。
なお、私たちがsynchronized(obj)を注釈して再度実行すれば、t 1とt 2は互いに切り換えることができる。以下はコメント調のsynchronizedのソースコードです。
// SleepLockTest.java ( synchronized(obj))
public class SleepLockTest{
private static Object obj = new Object();
public static void main(String[] args){
ThreadA t1 = new ThreadA("t1");
ThreadA t2 = new ThreadA("t2");
t.start();
t.start();
}
static class ThreadA extends Thread{
public ThreadA(String name){
super(name);
}
public void run(){
// obj
// synchronized (obj) {
try {
for(int i=0; i <10; i++){
System.out.printf("%s: %d
", this.getName(), i);
// i 4 , 100
if (i%4 == 0)
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
// }
}
}
}
以上は小编で绍介したJavaスレッドの休止です。動力ノードJava学院は整理して、みんなに助けがあることを望んで、もしみんなはいかなる疑問があるならば、メッセージを下さい。ここでも私たちのサイトを応援してくれてありがとうございます。