併發、並行傻傻分不清楚?線程的一輩子都經歷些什麼?

人生一切難題,知識給你答案

舒適提示:閱讀本文須要5-6分鐘(少許代碼)
公衆號:顧林海(天天更新優質文章)java


今天,咱們來解決一個問題:web

併發、並行傻傻分不清楚?線程的一輩子都經歷些什麼?編程

人生一切難題,知識給你答案。併發


==併發與並行==異步

併發是指在某個時間段內,多任務交替處理的能力。並行是指同時處理多任務的能力。ide

案例:商場銷售員須要面對多位顧客時,有的顧客問價格,有的顧客問質量,這時銷售員須要不斷的回答顧客,中間不停的切換話題並記住以前的話題,方便回過頭回答,這種方式能夠理解爲併發,若是有多位銷售員對應多位顧客,多位銷售員同時回答顧客問題,這種方式就是並行。spa

==線程的生命週期==線程

線程是CPU調度和分配的基本單位。線程能夠擁有本身的操做棧、程序計數器、局部變量表等資源,它與同一進程內的其餘線程共享該進程的全部資源。code

線程的建立有三種方式,第一種是繼承自Thread類,以下所示:cdn

public class HandlerThread extends Thread {
    
    @Override
    public void run() {
        
    }
    
}
複製代碼

第二種方式是實現Runnable接口,以下所示:

public class HandlerThread implements Runnable {

    @Override
    public void run() {

    }

}
複製代碼

推薦使用第二種方式,由於繼承Thread類不符合里氏替換原則,實現Runnable接口可使編程更加靈活,對外暴露的細節比較少。

第三種方式使用Callable接口,以下所示:

public class Demo implements Callable<String> {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<String> callable=new Demo();
        FutureTask<String> futureTask=new FutureTask<>(callable);
        new Thread(futureTask).start();
        System.out.println(futureTask.get());
    }

    @Override
    public String call() throws Exception {
        return "demo";
    }
}
複製代碼

Callable和Future接口的區別在於:

  • Callable規定的方法是call(),而Runnable規定的方法是run().
  • Callable的任務執行後可返回值,而Runnable的任務是不能返回值的。
  • call()方法可拋出異常,而run()方法是不能拋出異常的。
  • 運行Callable任務可拿到一個Future對象, Future表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。經過Future對象可瞭解任務執行狀況,可取消任務的執行,還可獲取任務執行的結果。
  • Callable是相似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。

線程的生命週期有五種狀態,以下圖:

線程五種狀態.jpg

線程的生命週期的狀態有:新建狀態、就緒狀態、運行狀態、阻塞狀態以及終止狀態。

  • new,新建狀態,是線程被建立且未啓動的狀態。
  • Runnable,就緒狀態,是調用start()方法以後運行以前的狀態,start()不能被屢次調用,不然會拋出IllegalStateException異常。
  • Running,運行狀態,是run()正在執行時線程的狀態。線程可能會因爲某些因素而推出Running,如時間、異常、鎖、調度等。
  • Blocked,阻塞狀態,進入此狀態的狀況包括:同步阻塞(鎖被其餘線程佔用)、主動阻塞(調用Thread的某些方法,主動讓出CPU執行權,好比sleep()、join()等)以及等待阻塞(執行了wait()方法)。
  • Dead,終止狀態,是run()執行結束,或因異常退出後的狀態。

838794-506ddad529df4cd4.webp.jpg
相關文章
相關標籤/搜索