程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java根本教程之線程休眠 java多線程教程

java根本教程之線程休眠 java多線程教程

編輯:關於JAVA

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();
                }
//            }
        }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved