java根本教程之線程休眠 java多線程教程。本站提示廣大學習愛好者:(java根本教程之線程休眠 java多線程教程)文章只能為提供參考,不一定能成為您想要的結果。以下是java根本教程之線程休眠 java多線程教程正文
本章觸及到的內容包含:
1. sleep()引見
2. sleep()示例
3. sleep() 與 wait()的比擬
1. sleep()引見
sleep() 界說在Thread.java中。
sleep() 的感化是讓以後線程休眠,即以後線程會從“運轉狀況”進入到“休眠(壅塞)狀況”。sleep()會指定休眠時光,線程休眠的時光會年夜於/等於該休眠時光;在線程從新被叫醒時,它會由“壅塞狀況”釀成“停當狀況”,從而期待cpu的調劑履行。
2. 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\n", this.getName(), i);
// i能被4整除時,休眠100毫秒
if (i%4 == 0)
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class SleepTest{
public static void main(String[] args){
ThreadA t1 = new ThreadA("t1");
t1.start();
}
}
運轉成果:
t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9
成果解釋:
法式比擬簡略,在主線程main中啟動線程t1。t1啟動以後,當t1中的盤算i能被4整除時,t1會經由過程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\n", this.getName(), i);
// i能被4整除時,休眠100毫秒
if (i%4 == 0)
Thread.sleep(100);
}
} catch (InterruptedException 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
成果解釋:
主線程main中啟動了兩個線程t1和t2。t1和t2在run()會援用統一個對象的同步鎖,即synchronized(obj)。在t1運轉進程中,固然它會挪用Thread.sleep(100);然則,t2是不會獲得cpu履行權的。由於,t1並沒有釋放“obj所持有的同步鎖”!
留意,若我們正文失落synchronized (obj)後再次履行該法式,t1和t2是可以互相切換的。上面是正文調synchronized(obj) 以後的源碼:
// 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");
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();
}
// }
}
}
}