線程的執行完全是自發的去搶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