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

java根本教程之線程妥協 java多線程教程

編輯:關於JAVA

java根本教程之線程妥協 java多線程教程。本站提示廣大學習愛好者:(java根本教程之線程妥協 java多線程教程)文章只能為提供參考,不一定能成為您想要的結果。以下是java根本教程之線程妥協 java多線程教程正文


本章觸及到的內容包含:
1. yield()引見
2. yield()示例
3. yield() 與 wait()的比擬

1. yield()引見
yield()的感化是妥協。它能讓以後線程由“運轉狀況”進入到“停當狀況”,從而讓其它具有雷同優先級的期待線程獲得履行權;然則,其實不能包管在以後線程挪用yield()以後,其它具有雷同優先級的線程就必定能取得履行權;也有能夠是以後線程又進入到“運轉狀況”持續運轉!

2. yield()示例
上面,經由過程示例檢查它的用法。


// YieldTest.java的源碼
class ThreadA extends Thread{
    public ThreadA(String name){
        super(name);
    }
    public synchronized void run(){
        for(int i=0; i <10; i++){
            System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i);
            // i整除4時,挪用yield
            if (i%4 == 0)
                Thread.yield();
        }
    }
}

public class YieldTest{
    public static void main(String[] args){
        ThreadA t1 = new ThreadA("t1");
        ThreadA t2 = new ThreadA("t2");
        t1.start();
        t2.start();
    }
}

(某一次的)運轉成果:


t1 [5]:0
t2 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9

成果解釋:
“線程t1”在能被4整數的時刻,並沒有切換到“線程t2”。這注解,yield()固然可讓線程由“運轉狀況”進入到“停當狀況”;然則,它紛歧定會讓其它線程獲得CPU履行權(即,其它線程進入到“運轉狀況”),即便這個“其它線程”與以後挪用yield()的線程具有雷同的優先級。

3. yield() 與 wait()的比擬
我們曉得,wait()的感化是讓以後線程由“運轉狀況”進入“期待(壅塞)狀況”的同時,也會釋放同步鎖。而yield()的感化是妥協,它也會讓以後線程分開“運轉狀況”。它們的差別是:
(01) wait()是讓線程由“運轉狀況”進入到“期待(壅塞)狀況”,而不yield()是讓線程由“運轉狀況”進入到“停當狀況”。
(02) wait()是會線程釋放它所持有對象的同步鎖,而yield()辦法不會釋放鎖。

上面經由過程示例演示yield()是不會釋放鎖的。


// YieldLockTest.java 的源碼
public class YieldLockTest{

    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) {
                for(int i=0; i <10; i++){
                    System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i);
                    // i整除4時,挪用yield
                    if (i%4 == 0)
                        Thread.yield();
                }
            }
        }
    }
}

(某一次)運轉成果:


t1 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:0
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9

成果解釋:
主線程main中啟動了兩個線程t1和t2。t1和t2在run()會援用統一個對象的同步鎖,即synchronized(obj)。在t1運轉進程中,固然它會挪用Thread.yield();然則,t2是不會獲得cpu履行權的。由於,t1並沒有釋放“obj所持有的同步鎖”!

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