通用執行緒池

2022-09-12 06:18:11 字數 3415 閱讀 8156

將runable和callable包裝成runnablefuture物件,呼叫子類實現的execute(runablefuture)防範】

/**

* @throws rejectedexecutionexception

* @throws nullpointerexception

*/public future> submit(runnable task)

/*** @throws rejectedexecutionexception

* @throws nullpointerexception

*/public futuresubmit(runnable task, t result)

/*** @throws rejectedexecutionexception

* @throws nullpointerexception

*/public futuresubmit(callabletask)

4.2 invokeall

4.3 invokeany

5. threadpoolexecutorservice實現

// 用高3位表示執行緒池的狀態, 總共5個狀態,3位正好可以表示

private static final int count_bits = integer.size - 3;

private static final int count_mask = (1 << count_bits) - 1;

// runstate is stored in the high-order bits

private static final int running = -1 << count_bits;

private static final int shutdown = 0 << count_bits;

private static final int stop = 1 << count_bits;

private static final int tidying = 2 << count_bits;

private static final int terminated = 3 << count_bits;

5.1 shutdown()
public void shutdown()  finally 

// 這裡會嘗試終止,實際不一定能終止,最後乙個執行緒會呼叫終止

tryterminate();

}

5.2 shutdownnow()
public listshutdownnow()  finally 

// 這裡會嘗試終止,實際不一定能終止,最後乙個執行緒會呼叫終止

tryterminate();

return tasks;

}

5.3 awaitterminated() & tryterminate()
public boolean awaittermination(long timeout, timeunit unit)

throws interruptedexception

} finally

}final void tryterminate()

// 只有乙個執行緒會執行到下面的**,其他執行緒在上面return了

final reentrantlock mainlock = this.mainlock;

mainlock.lock();

try finally

return;

}} finally

// else retry on failed cas}}

5.4 核心方法:execute

執行下面的操作:

public void execute(runnable command) 

// 如果是執行狀態說明,新增失敗的原因是超過核心線執行緒數,先新增到佇列中

if (isrunning(c) && workqueue.offer(command))

// 新增到佇列失敗,建立非核心執行緒,執行任務

else if (!addworker(command, false))

// 執行拒絕策略

reject(command);

}

5.5 核心方法addworker
worker(runnable firsttask) 

/** * firsttask: 第乙個需要執行的任務

* core: 是否建立核心執行緒數

**/private boolean addworker(runnable firsttask, boolean core)

}// 工作執行緒數已經+1, 如果真正啟動失敗,會回滾

boolean workerstarted = false;

boolean workeradded = false;

worker w = null;

try

} finally

if (workeradded)

}} finally

return workerstarted;

}

5.6 woker.runwork(worker w)方法
final void runworker(worker w)  catch (throwable ex) 

} finally

}// 有異常的情況下,該值位true

completedabruptly = false;

} finally

}private void processworkerexit(worker w, boolean completedabruptly) finally

tryterminate();

int c = ctl.get();

if (runstatelessthan(c, stop))

addworker(null, false);}}

通用記憶體池

通用的記憶體池 首先開闢大記憶體塊,以靜態鍊錶 的形式組織,有好多節點,每個 節點分兩部分 資料儲存使用和記憶體管理使用 這兩部分每次開闢應開闢多少?假設開闢乙個節點 new 乙個 int 系統計算出是4個位元組,傳給 size 開闢的時候應該是 4 4 資料儲存使用和記憶體管理使用 假設現在設計乙...

(通用之學習)執行緒池的那些事兒

執行緒池 一般流程 建立執行緒 建立任務 執行任務 關閉執行緒 在一定時間後可自動關閉 前情提要 如果併發的執行緒數量很多,並且每個執行緒都是執行乙個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷毀執行緒需要時間。需求實現 執行緒池是乙個容納多個執行緒的容器...

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...