執行緒池存在的意義
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第4天,點選檢視活動詳情
前言
- 再次之前我已經花費大量篇幅介紹了Java原聲鎖和Lock鎖。在文章中提到偏向送、輕量級鎖、重量級鎖、公平鎖、非公平鎖、自旋鎖、自適應自旋鎖、分散式鎖、分段鎖等等鎖。所有的鎖都是為了解決一個問題應運而生的那就是併發。而產生併發的原因是CPU的發展導致我們程式多執行緒執行。在程式碼中我們也經常通過多執行緒來提高產品的吞吐量。
- 在鎖章節中我們也是通過多執行緒案例模擬鎖的產生的。那麼Java領域中有哪幾種方式生成執行緒呢?容我慢慢道來
建立執行緒
繼承Thread
- 建立執行緒的方式Java為我們提供了四種方式,首先是繼承Thread 。複寫run方法就可以了。
public class ExtendThread extends Thread{
private Integer index;
public ExtendThread(Integer index) {
this.index = index;
}
@Override
public void run() {
System.out.println("當前索引值:"+index);
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new ExtendThread(i).start();
}
}
}
實現Runnable介面
- 第二種方式就是實現Runnable介面。我們點進Thread原始碼也能看到,thread的構造需要一個Runnable介面。
public class TestRunnable implements Runnable{
private String userName;
public TestRunnable(String userName) {
this.userName = userName;
}
@SneakyThrows
@Override
public void run() {
TimeUnit.SECONDS.sleep(1);
System.out.println("當前名稱:"+userName);
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(new TestRunnable(String.format("我是%s", i))).start();
}
}
}
實現Callable介面
- 除了上面兩種還有一個介面實現。還有一個Callable他和Runnable的區別在於有返回值
public class TestCallable implements Callable {
private int i;
public TestCallable(int i) {
this.i = i;
}
@Override
public Object call() throws Exception {
System.out.println(Thread.currentThread()+"我是"+i);
return i;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
final FutureTask futureTask = new FutureTask(new TestCallable(1));
for (int i = 0; i < 100; i++) {
new Thread(new FutureTask(new TestCallable(i))).start();
}
System.out.println(futureTask.get());
}
}
執行緒池
- 上面三種應該算是執行緒建立的基本方式。為了提高效能減少執行緒的開闢與銷燬,JDK提出了執行緒池的概念。執行緒池主要是線上程閒置後進行回收防止被JVM銷燬。這樣下次在來任務的時候就可以直接將閒置的執行緒提供給任務使用就可以了。執行緒池的建立預設有三種方式。這裡我們使用其中一種,至於執行緒池我們後面會著重介紹。
public class TPools {
public static void main(String[] args) {
final ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
int finalI = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("@@@@@"+ finalI);
}
});
}
}
}
小結
- 本章節我們簡單介紹了四種方式建立執行緒。使用上沒有區別。需要注意
Callable
介面是具有返回值的。這種方式其實我們可以用來確認執行緒是否執行了。然後就是執行緒池方式建立。從執行緒的角度四種方式創建出來的執行緒具有同等性質。不同的是執行緒池會對執行緒進行回收管理。關於他的回收策略JDK給我們提供了不同的預設策略。也支援我們自定義執行緒結構。
\
- 避免回表,引入索引下推|提高索引命中率 | 提前下班啦
- TDengine 時序性資料庫為什麼海量資料下不卡頓呢
- 神奇的XPath,快速完成前端及XML的元素定位,茫茫大海不迷路
- springboot通用分支處理---還在硬編碼特殊處理邏輯?超級管理員不應該被區別對待
- Spring事務太強大了,相容資料庫同時給我們提供多種組合應對業務需求
- java物件在記憶體中如何分佈 | java上鎖原來就是記憶體佔位,so easy
- linux三劍客之編輯器sed出廠
- linux三劍客awk教你如何裁剪結果集
- 執行緒池7個引數拿捏死死的,完爆面試官
- 執行緒池存在的意義
- 多年程式設計師總結下來的懶人必備指令碼之進度條⚠️製作
- java中的static關鍵字說清楚還得靠JVM
- 設計模式存在哪些關聯關係,六種關係傻傻分不清--- UML圖示詳解
- 每次需求評審產品總是讓我提高程式碼複用,說白了就是合成複用原則
- 越級上報不可行,各司其職才是王道---迪米特法則
- 偏向鎖/輕量鎖/重級鎖鎖鎖更健康,上鎖解鎖到底是怎麼完成實現的,我來告訴你
- 狸貓換太子里氏替換原則;不要一味的進行抽象否則最後你無法hold你的物件
- 設計模式是我擺脫碼畜的唯一出路---依賴倒轉原則
- 學好數理化,寫遍所有程式碼都不怕,我用數學分類討論的思想解決
- synchronized已經不在臃腫了,放下對他的成見之初識輕量級鎖