java線程的優先級、狀態、以及sleep、wait等方法

一、new(新建) 剛剛建立出來的線程如 new Thread異步

二、Runable (可運行的) 在線程調用了start方法以後ide

三、Running (正在運行的) CPU給此線程分配了時間片,這個狀態是全部線程但願的狀態線程

四、Dead (死亡狀態) run方法執行完畢或者異常退出對象

五、Blocked (阻塞狀態) 資源

阻塞狀態分爲三種同步

(1)等待阻塞:運行線程執行wait方法(wait方法是Object對象的),JVM會把當前線程放進等待池中it

(2)同步阻塞:運行線程獲取對象的同步鎖時,若此時鎖被其餘線程佔用,JVM會把當前線程放進鎖池中io

(3)其餘阻塞:運行線程執行sleep或join方法時(sleep、join方法是Thread對象的),或者線程在處理I/O請求時,JVM會把當前線程置爲阻塞狀態,當sleep超時或者join等待線程停止、或者I/O處理完畢時,線程恢復爲可運行狀態class

 

wait、sleep、join的區別test

wait是object類的方法

sleep、join是Thread類的方法

sleep時優先級低的線程也有了執行權利,可是sleep時不會釋放鎖資源(抱着鎖睡)

 

 

線程的優先級:

線程的優先級用1-10之間的數字表示,最高爲10,最低爲1,默認爲5,子線程優先級與其父同樣。

 

說到線程,不可避免的要說到鎖

Synchronized關鍵字,鎖的是對象,是類,而不是代碼

當Synchronized和static一塊兒修飾一段代碼或者方法時,就是類鎖了,做爲類鎖時,此類全部的對象將都上鎖。好比下面代碼

public class Student{

//    public static  Test  test= new Test();

    public static void main(String[] args) {


        Thread t1 = new Thread("T1"){
            @Override
            public void run() {
                test();
            }
        };
        Thread t2 = new Thread("T2"){
            @Override
            public void run() {
                test();
            }
        };
        t1.start();
        t2.start();

    }

    public static void test(){
        Test  test= new Test()
        System.out.println(test);
        test.fun2();
    }

}

t1和t2是兩個線程,他們的執行都調用了test方法,test方法新建了一個Test對象

Test類以下

public class Test {


    public  static void fun1(){
        System.out.println("fun1方法運行了,調用對象爲");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized  void fun2(){
        System.out.println("fun2方法運行了");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

兩個線程調用test()方法時,不是一個test對象調用的,每一個線程都new Test()了,可是fun2()是Synchronized而且是static的,也就是加了類鎖,因此這裏,fun2中的代碼仍是同步執行的,而不是異步

相關文章
相關標籤/搜索