線程的執行順序


線程的執行完全是自發的去搶CPU時間片,誰先搶到誰就先去執行
package com.pers.xiancheng;
public class Test implements Runnable { int count;//默認是0 static Object obj = new Object(); @Override public void run() { //synchronized塊鎖定的是整個對象 synchronized (obj) {//synchronized 是用來獲得對象鎖,只有獲得鎖的線程才能執行synchronized{}里面的代碼 if (Thread.currentThread().getName().equals("a") || Thread.currentThread().getName().equals("b")) { count++; System.out.println(Thread.currentThread().getName() + "_" + count); } else { count--; System.out.println(Thread.currentThread().getName() + "_" + count); } } } public static void main(String[] args) throws InterruptedException { Test t = new Test(); //不確定的是執行的次序->輸出的次序及結果...... /* d_-1 a_1 a_1 a_1 a_0 d_0 c_0 b_2 c_-1 c_-1 d_-1 c_1 b_0 b_0 b_0 d_0 * */ new Thread(t, "a").start(); new Thread(t, "b").start(); new Thread(t, "c").start(); new Thread(t, "d").start(); Thread.sleep(1000); System.out.println(t.count);//0 } }

 按照正常的邏輯,是沒有辦法去對線程的執行順序進行控制的,因為線程的執行完全是自發地去搶CPU時間片,誰搶到誰先執行。
     除非你在程序內部控制,設計一個執行順序記錄的全局變量A。如果1執行完,變量A賦值為1,如果是2接着搶到了時間片,則可以直接正常執行,將變量A設置為2;如果是3搶到了CPU時間片,則直接退出線程,不允許3在變量A為1的時候執行

package com.pers.xiancheng;
/*1.如果你有三個線程,分別為T1,T2,T3,如何讓線程T2在線程T1之后執行,在線程T3之前執行。
答案是:使用線程的join方法,該方法的作用是“等待線程執行結束”,即join()方法后面的代碼塊都要等待現場執行結束后才能執行
 * 線程的優先級無法保障線程的執行次序。只不過優先級高的線程獲取 CPU 資源的概率大一點而已。
 */
public class ThreadABC {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runner());
        Thread t2 = new Thread(new Runner());
        Thread t3 = new Thread(new Runner());
        t1.start();
        t1.sleep(5000);
        t1.join();

        t2.start();
        t2.sleep(1000);
        t2.join();
        t3.start();
        t3.join();

    }

}
class Runner implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "");
    }
}
執行結果如下:
Thread-0
Thread-1
Thread-2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM