舒適提示:閱讀本文須要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接口的區別在於:
線程的生命週期有五種狀態,以下圖:
線程的生命週期的狀態有:新建狀態、就緒狀態、運行狀態、阻塞狀態以及終止狀態。