將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 核心方法addworkerworker(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 資料儲存使用和記憶體管理使用 假設現在設計乙...
(通用之學習)執行緒池的那些事兒
執行緒池 一般流程 建立執行緒 建立任務 執行任務 關閉執行緒 在一定時間後可自動關閉 前情提要 如果併發的執行緒數量很多,並且每個執行緒都是執行乙個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷毀執行緒需要時間。需求實現 執行緒池是乙個容納多個執行緒的容器...
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...