Java線程的講解

初始(NEW):新創建了一個線程對象,但還沒有調用start()方法。
運行(RUNNABLE):Java線程中將就緒(ready)和運行中(running)兩種狀態籠統的稱爲“運行”。
阻塞(BLOCKED):表示線程阻塞於鎖。
等待(WAITING):進入該狀態的線程需要等待其他線程做出一些特定動作(通知或中斷)。
超時等待(TIMED_WAITING):該狀態不同於WAITING,它可以在指定的時間後自行返回。
終止(TERMINATED):表示該線程已經執行完畢。
在這裏插入圖片描述

線程的創建:

(1.)實現Runnable接口
(2.)繼承Thread類
(3.)實現Callable接口

public class DemoThread extends Thread {
    public DemoThread(String name) {
        this.setName(name);
    }
    @Override
    public void run() {
        System.out.println("線程名稱:"+Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        DemoThread demoThread = new DemoThread("線程1");
        demoThread.start();
    }
}

```java
public class DemoThread implements Runnable {
    @Override
    public void run() {
        System.out.println("線程名稱:"+Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        DemoThread demoThread = new DemoThread();
        Thread thread = new Thread(demoThread, "線程1");
        thread.start();
    }
}

方法的比較

1.Thread.sleep(long millis),一定是當前線程調用此方法,當前線程進入TIMED_WAITING狀態,但不釋放對象鎖,millis後線程自動甦醒進入就緒狀態。作用:給其它線程執行機會的最佳方式。
2. Thread.yield(),一定是當前線程調用此方法,當前線程放棄獲取的CPU時間片,但不釋放鎖資源,由運行狀態變爲就緒狀態,讓OS再次選擇線程。作用:讓相同優先級的線程輪流執行,但並不保證一定會輪流執行。實際中無法保證yield()達到讓步目的,因爲讓步的線程還有可能被線程調度程序再次選中。Thread.yield()不會導致阻塞。該方法與sleep()類似,只是不能由用戶指定暫停多長時間。
3.thread.join()/thread.join(long millis),當前線程裏調用其它線程t的join方法,當前線程進入WAITING/TIMED_WAITING狀態,當前線程不會釋放已經持有的對象鎖。線程t執行完畢或者millis時間到,當前線程一般情況下進入RUNNABLE狀態,也有可能進入BLOCKED狀態(因爲join是基於wait實現的)。
4.obj.wait(),當前線程調用對象的wait()方法,當前線程釋放對象鎖,進入等待隊列。依靠notify()/notifyAll()喚醒或者wait(long timeout) timeout時間到自動喚醒。
5. obj.notify()喚醒在此對象監視器上等待的單個線程選擇是任意性的。
notifyAll()喚醒在此對象監視器上等待的所有線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章