1 sleep()介紹
sleep()定義在Thread.java中
sleep()的作用是讓當前線程休眠,即當前線程會從"運行狀態"進入到"休眠(阻塞)狀態。sleep()會指定休眠時間,線程休眠的時間會大於/等於該休眠時間;在線程重新被喚醒時,它會由阻塞狀態變成就緒狀態,從而等於cpu的調度執行
2 sleep()示例
package com.tuhu.filt.javadatasleep;
public class SleepTest {
public static void main(String[] args) {
ThreadC t1 = new ThreadC("t1");
t1.start();
}
}
class ThreadC extends Thread{
public ThreadC (String name){
super(name);
}
public synchronized void run(){
try{
for (int i = 0;i < 10;i++) {
System.out.printf("%s: %d\n", this.getName(), i);
if( i%4 ==0){
Thread.sleep(100);
}
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
程序比較簡單在主線程main中啓動線程t1.t1啓動之後,當t1中的計算能被4整除時,t1會通過Thread.sleep(100)休眠100毫秒
3 sleep()與 wait()
wait 讓當前線程由運行狀態進入到等待阻塞狀態 會釋放同步鎖
sleep 讓當前線程由運行狀態進入休眠阻塞狀態 不會釋放同步鎖
下面通過示例演示sleep()是不會釋放的
package com.tuhu.filt.javadatasleep;
// 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\n", this.getName(), i);
// i能被4整除時,休眠100毫秒
if (i%4 == 0)
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
這和上一篇一個東西差不多,主線程main中啓動了兩個線程t1 和 t2 ,他們會引用同一個對象的同步鎖,即synchronized(obj),在t1運行過程中,雖然他會調用Thread.sleep(100);但是t2是不會獲取cpu執行權的。因爲t1沒有釋放同步鎖 註釋掉synchronized(obj)後再次執行該程序t1和t2是可以相互切換的。比如用this
package com.tuhu.filt.javadatasleep;
// 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 (this) {
try {
for(int i=0; i <10; i++){
System.out.printf("%s: %d\n", this.getName(), i);
// i能被4整除時,休眠100毫秒
if (i%4 == 0)
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}