JUC線程池(1):線程池架構(gòu)

線程池架構(gòu)圖

1.Executor

它是一個(gè)接口能犯,用來(lái)執(zhí)行任務(wù)的。準(zhǔn)確來(lái)說(shuō)担孔,Executor提供了execute()方法接受Runnable參數(shù)色洞,來(lái)執(zhí)行Runnable對(duì)象的任務(wù)。Execute存在的目的是提供一種將“任務(wù)提交”與“任務(wù)如何運(yùn)行”分離開(kāi)的機(jī)制评也。
源碼如下:

public interface Executor {

    /**
     * Executes the given command at some time in the future.  The command
     * may execute in a new thread, in a pooled thread, or in the calling
     * thread, at the discretion of the {@code Executor} implementation.
     *
     * @param command the runnable task
     * @throws RejectedExecutionException if this task cannot be
     * accepted for execution
     * @throws NullPointerException if command is null
     */
    void execute(Runnable command);
}

2.ExecutorService

ExecutorService繼承自Executor炼杖。它是“執(zhí)行者服務(wù)”接口,是為“執(zhí)行者接口Executor”服務(wù)而存在的盗迟;準(zhǔn)確來(lái)說(shuō)坤邪,ExecutorService提供了“將任務(wù)提交給執(zhí)行者的接口(submit方法)”,“讓執(zhí)行者執(zhí)行任務(wù)(invokeAll罚缕,invokeAny方法)”的接口等待艇纺。

ExecutorService的函數(shù)列表(源碼的解釋太多了,占有篇幅)
// 請(qǐng)求關(guān)閉邮弹、發(fā)生超時(shí)或者當(dāng)前線程中斷黔衡,無(wú)論哪一個(gè)首先發(fā)生之后,都將導(dǎo)致阻塞腌乡,直到所有任務(wù)完成執(zhí)行盟劫。
boolean awaitTermination(long timeout, TimeUnit unit)
// 執(zhí)行給定的任務(wù),當(dāng)所有任務(wù)完成時(shí)与纽,返回保持任務(wù)狀態(tài)和結(jié)果的 Future 列表侣签。
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
// 執(zhí)行給定的任務(wù),當(dāng)所有任務(wù)完成或超時(shí)期滿時(shí)(無(wú)論哪個(gè)首先發(fā)生)急迂,返回保持任務(wù)狀態(tài)和結(jié)果的 Future 列表影所。
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
// 執(zhí)行給定的任務(wù),如果某個(gè)任務(wù)已成功完成(也就是未拋出異常)僚碎,則返回其結(jié)果猴娩。
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
// 執(zhí)行給定的任務(wù),如果在給定的超時(shí)期滿前某個(gè)任務(wù)已成功完成(也就是未拋出異常),則返回其結(jié)果卷中。
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
// 如果此執(zhí)行程序已關(guān)閉矛双,則返回 true。
boolean isShutdown()
// 如果關(guān)閉后所有任務(wù)都已完成仓坞,則返回 true背零。
boolean isTerminated()
// 啟動(dòng)一次順序關(guān)閉,執(zhí)行以前提交的任務(wù)无埃,但不接受新任務(wù)徙瓶。
void shutdown()
// 試圖停止所有正在執(zhí)行的活動(dòng)任務(wù),暫停處理正在等待的任務(wù)嫉称,并返回等待執(zhí)行的任務(wù)列表侦镇。
List<Runnable> shutdownNow()
// 提交一個(gè)返回值的任務(wù)用于執(zhí)行,返回一個(gè)表示任務(wù)的未決結(jié)果的 Future织阅。
<T> Future<T> submit(Callable<T> task)
// 提交一個(gè) Runnable 任務(wù)用于執(zhí)行壳繁,并返回一個(gè)表示該任務(wù)的 Future。
Future<?> submit(Runnable task)
// 提交一個(gè) Runnable 任務(wù)用于執(zhí)行荔棉,并返回一個(gè)表示該任務(wù)的 Future闹炉。
<T> Future<T> submit(Runnable task, T result)

3.AbstractExecutorService

AbstractExecutorService是一個(gè)抽象類,它實(shí)現(xiàn)了ExecutorService接口润樱。AbstractExecutorService存在的目的是提供了ExecutorService的默認(rèn)實(shí)現(xiàn)渣触。

AbstractExecutorService函數(shù)列表

由于它的函數(shù)列表和ExecutorService一樣,這里就不再重復(fù)列舉了壹若。

4.ThreadPoolExecutor

ThreadPoolExecutor就是“線程池”嗅钻,它繼承與AbstractExecutorService抽象類。

ThreadPoolExecutor函數(shù)列表
// 用給定的初始參數(shù)和默認(rèn)的線程工廠及被拒絕的執(zhí)行處理程序創(chuàng)建新的 ThreadPoolExecutor店展。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
// 用給定的初始參數(shù)和默認(rèn)的線程工廠創(chuàng)建新的 ThreadPoolExecutor养篓。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
// 用給定的初始參數(shù)和默認(rèn)被拒絕的執(zhí)行處理程序創(chuàng)建新的 ThreadPoolExecutor。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
// 用給定的初始參數(shù)創(chuàng)建新的 ThreadPoolExecutor赂蕴。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

// 基于完成執(zhí)行給定 Runnable 所調(diào)用的方法柳弄。
protected void afterExecute(Runnable r, Throwable t)
// 如果在保持活動(dòng)時(shí)間內(nèi)沒(méi)有任務(wù)到達(dá),新任務(wù)到達(dá)時(shí)正在替換(如果需要)概说,則設(shè)置控制核心線程是超時(shí)還是終止的策略碧注。
void allowCoreThreadTimeOut(boolean value)
// 如果此池允許核心線程超時(shí)和終止,如果在 keepAlive 時(shí)間內(nèi)沒(méi)有任務(wù)到達(dá)席怪,新任務(wù)到達(dá)時(shí)正在替換(如果需要)应闯,則返回 true纤控。
boolean allowsCoreThreadTimeOut()
// 請(qǐng)求關(guān)閉挂捻、發(fā)生超時(shí)或者當(dāng)前線程中斷,無(wú)論哪一個(gè)首先發(fā)生之后船万,都將導(dǎo)致阻塞刻撒,直到所有任務(wù)完成執(zhí)行骨田。
boolean awaitTermination(long timeout, TimeUnit unit)
// 在執(zhí)行給定線程中的給定 Runnable 之前調(diào)用的方法。
protected void beforeExecute(Thread t, Runnable r)
// 在將來(lái)某個(gè)時(shí)間執(zhí)行給定任務(wù)声怔。
void execute(Runnable command)
// 當(dāng)不再引用此執(zhí)行程序時(shí)态贤,調(diào)用 shutdown。
protected void finalize()
// 返回主動(dòng)執(zhí)行任務(wù)的近似線程數(shù)醋火。
int getActiveCount()
// 返回已完成執(zhí)行的近似任務(wù)總數(shù)悠汽。
long getCompletedTaskCount()
// 返回核心線程數(shù)。
int getCorePoolSize()
// 返回線程保持活動(dòng)的時(shí)間芥驳,該時(shí)間就是超過(guò)核心池大小的線程可以在終止前保持空閑的時(shí)間值柿冲。
long getKeepAliveTime(TimeUnit unit)
// 返回曾經(jīng)同時(shí)位于池中的最大線程數(shù)。
int getLargestPoolSize()
// 返回允許的最大線程數(shù)兆旬。
int getMaximumPoolSize()
// 返回池中的當(dāng)前線程數(shù)假抄。
int getPoolSize()
// 返回此執(zhí)行程序使用的任務(wù)隊(duì)列。
BlockingQueue<Runnable> getQueue()
// 返回用于未執(zhí)行任務(wù)的當(dāng)前處理程序丽猬。
RejectedExecutionHandler getRejectedExecutionHandler()
// 返回曾計(jì)劃執(zhí)行的近似任務(wù)總數(shù)宿饱。
long getTaskCount()
// 返回用于創(chuàng)建新線程的線程工廠。
ThreadFactory getThreadFactory()
// 如果此執(zhí)行程序已關(guān)閉脚祟,則返回 true谬以。
boolean isShutdown()
// 如果關(guān)閉后所有任務(wù)都已完成,則返回 true愚铡。
boolean isTerminated()
// 如果此執(zhí)行程序處于在 shutdown 或 shutdownNow 之后正在終止但尚未完全終止的過(guò)程中蛉签,則返回 true。
boolean isTerminating()
// 啟動(dòng)所有核心線程沥寥,使其處于等待工作的空閑狀態(tài)碍舍。
int prestartAllCoreThreads()
// 啟動(dòng)核心線程,使其處于等待工作的空閑狀態(tài)邑雅。
boolean prestartCoreThread()
// 嘗試從工作隊(duì)列移除所有已取消的 Future 任務(wù)片橡。
void purge()
// 從執(zhí)行程序的內(nèi)部隊(duì)列中移除此任務(wù)(如果存在),從而如果尚未開(kāi)始淮野,則其不再運(yùn)行捧书。
boolean remove(Runnable task)
// 設(shè)置核心線程數(shù)。
void setCorePoolSize(int corePoolSize)
// 設(shè)置線程在終止前可以保持空閑的時(shí)間限制骤星。
void setKeepAliveTime(long time, TimeUnit unit)
// 設(shè)置允許的最大線程數(shù)经瓷。
void setMaximumPoolSize(int maximumPoolSize)
// 設(shè)置用于未執(zhí)行任務(wù)的新處理程序。
void setRejectedExecutionHandler(RejectedExecutionHandler handler)
// 設(shè)置用于創(chuàng)建新線程的線程工廠洞难。
void setThreadFactory(ThreadFactory threadFactory)
// 按過(guò)去執(zhí)行已提交任務(wù)的順序發(fā)起一個(gè)有序的關(guān)閉舆吮,但是不接受新任務(wù)。
void shutdown()
// 嘗試停止所有的活動(dòng)執(zhí)行任務(wù)、暫停等待任務(wù)的處理色冀,并返回等待執(zhí)行的任務(wù)列表潭袱。
List<Runnable> shutdownNow()
// 當(dāng) Executor 已經(jīng)終止時(shí)調(diào)用的方法。
protected void terminated()

5.ScheduledExecutorService

ScheduledExecutorService是一個(gè)接口锋恬,它繼承于ExecutorService屯换。它相當(dāng)于提供了“延時(shí)”和“周期執(zhí)行”功能的ExecutorService。ScheduledExecutorService提供了相應(yīng)的函數(shù)接口与学,可以安排任務(wù)在給定的延遲后執(zhí)行彤悔,也可以讓任務(wù)周期的執(zhí)行。

ScheduledExecutorService函數(shù)列表
// 創(chuàng)建并執(zhí)行在給定延遲后啟用的 ScheduledFuture索守。
<V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
// 創(chuàng)建并執(zhí)行在給定延遲后啟用的一次性操作蜗巧。
ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
// 創(chuàng)建并執(zhí)行一個(gè)在給定初始延遲后首次啟用的定期操作,后續(xù)操作具有給定的周期蕾盯;也就是將在 initialDelay 后開(kāi)始執(zhí)行幕屹,然后在 initialDelay+period 后執(zhí)行,接著在 initialDelay + 2 * period 后執(zhí)行级遭,依此類推望拖。
ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
// 創(chuàng)建并執(zhí)行一個(gè)在給定初始延遲后首次啟用的定期操作,隨后挫鸽,在每一次執(zhí)行終止和下一次執(zhí)行開(kāi)始之間都存在給定的延遲说敏。
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)

6.ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor繼承于ThreadPoolExecutor,并且實(shí)現(xiàn)了ScheduledExecutorService接口丢郊。它相當(dāng)于提供了"延時(shí)"和"周期執(zhí)行"功能的ScheduledExecutorService盔沫。ScheduledThreadPoolExecutor類似于Timer,但是在高并發(fā)程序中枫匾,ScheduledThreadPoolExecutor的性能要優(yōu)于Timer架诞。

ScheduledThreadPoolExecutor函數(shù)列表
// 使用給定核心池大小創(chuàng)建一個(gè)新 ScheduledThreadPoolExecutor。
ScheduledThreadPoolExecutor(int corePoolSize)
// 使用給定初始參數(shù)創(chuàng)建一個(gè)新 ScheduledThreadPoolExecutor干茉。
ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler)
// 使用給定的初始參數(shù)創(chuàng)建一個(gè)新 ScheduledThreadPoolExecutor谴忧。
ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory)
// 使用給定初始參數(shù)創(chuàng)建一個(gè)新 ScheduledThreadPoolExecutor。
ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler)

// 修改或替換用于執(zhí)行 callable 的任務(wù)角虫。
protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task)
// 修改或替換用于執(zhí)行 runnable 的任務(wù)沾谓。
protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task)
// 使用所要求的零延遲執(zhí)行命令。
void execute(Runnable command)
// 獲取有關(guān)在此執(zhí)行程序已 shutdown 的情況下戳鹅、是否繼續(xù)執(zhí)行現(xiàn)有定期任務(wù)的策略均驶。
boolean getContinueExistingPeriodicTasksAfterShutdownPolicy()
// 獲取有關(guān)在此執(zhí)行程序已 shutdown 的情況下是否繼續(xù)執(zhí)行現(xiàn)有延遲任務(wù)的策略。
boolean getExecuteExistingDelayedTasksAfterShutdownPolicy()
// 返回此執(zhí)行程序使用的任務(wù)隊(duì)列枫虏。
BlockingQueue<Runnable> getQueue()
// 從執(zhí)行程序的內(nèi)部隊(duì)列中移除此任務(wù)(如果存在)妇穴,從而如果尚未開(kāi)始亮垫,則其不再運(yùn)行。
boolean remove(Runnable task)
// 創(chuàng)建并執(zhí)行在給定延遲后啟用的 ScheduledFuture伟骨。
<V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
// 創(chuàng)建并執(zhí)行在給定延遲后啟用的一次性操作。
ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
// 創(chuàng)建并執(zhí)行一個(gè)在給定初始延遲后首次啟用的定期操作燃异,后續(xù)操作具有給定的周期携狭;也就是將在 initialDelay 后開(kāi)始執(zhí)行,然后在 initialDelay+period 后執(zhí)行回俐,接著在 initialDelay + 2 * period 后執(zhí)行逛腿,依此類推。
ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
// 創(chuàng)建并執(zhí)行一個(gè)在給定初始延遲后首次啟用的定期操作仅颇,隨后单默,在每一次執(zhí)行終止和下一次執(zhí)行開(kāi)始之間都存在給定的延遲。
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
// 設(shè)置有關(guān)在此執(zhí)行程序已 shutdown 的情況下是否繼續(xù)執(zhí)行現(xiàn)有定期任務(wù)的策略忘瓦。
void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value)
// 設(shè)置有關(guān)在此執(zhí)行程序已 shutdown 的情況下是否繼續(xù)執(zhí)行現(xiàn)有延遲任務(wù)的策略搁廓。
void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value)
// 在以前已提交任務(wù)的執(zhí)行中發(fā)起一個(gè)有序的關(guān)閉,但是不接受新任務(wù)耕皮。
void shutdown()
// 嘗試停止所有正在執(zhí)行的任務(wù)境蜕、暫停等待任務(wù)的處理,并返回等待執(zhí)行的任務(wù)列表凌停。
List<Runnable> shutdownNow()
// 提交一個(gè)返回值的任務(wù)用于執(zhí)行粱年,返回一個(gè)表示任務(wù)的未決結(jié)果的 Future。
<T> Future<T> submit(Callable<T> task)
// 提交一個(gè) Runnable 任務(wù)用于執(zhí)行罚拟,并返回一個(gè)表示該任務(wù)的 Future台诗。
Future<?> submit(Runnable task)
// 提交一個(gè) Runnable 任務(wù)用于執(zhí)行,并返回一個(gè)表示該任務(wù)的 Future赐俗。
<T> Future<T> submit(Runnable task, T result)

6.Executors

Executors是個(gè)靜態(tài)工廠類拉队。它通過(guò)靜態(tài)工廠方法返回ExecutorService、ScheduledExecutorService阻逮、ThreadFactory 和 Callable 等類的對(duì)象氏仗。

Executors函數(shù)列表
// 返回 Callable 對(duì)象,調(diào)用它時(shí)可運(yùn)行給定特權(quán)的操作并返回其結(jié)果夺鲜。
static Callable<Object> callable(PrivilegedAction<?> action)
// 返回 Callable 對(duì)象皆尔,調(diào)用它時(shí)可運(yùn)行給定特權(quán)的異常操作并返回其結(jié)果。
static Callable<Object> callable(PrivilegedExceptionAction<?> action)
// 返回 Callable 對(duì)象币励,調(diào)用它時(shí)可運(yùn)行給定的任務(wù)并返回 null慷蠕。
static Callable<Object> callable(Runnable task)
// 返回 Callable 對(duì)象,調(diào)用它時(shí)可運(yùn)行給定的任務(wù)并返回給定的結(jié)果食呻。
static <T> Callable<T> callable(Runnable task, T result)
// 返回用于創(chuàng)建新線程的默認(rèn)線程工廠流炕。
static ThreadFactory defaultThreadFactory()
// 創(chuàng)建一個(gè)可根據(jù)需要?jiǎng)?chuàng)建新線程的線程池澎现,但是在以前構(gòu)造的線程可用時(shí)將重用它們。
static ExecutorService newCachedThreadPool()
// 創(chuàng)建一個(gè)可根據(jù)需要?jiǎng)?chuàng)建新線程的線程池每辟,但是在以前構(gòu)造的線程可用時(shí)將重用它們剑辫,并在需要時(shí)使用提供的 ThreadFactory 創(chuàng)建新線程。
static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)
// 創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池渠欺,以共享的無(wú)界隊(duì)列方式來(lái)運(yùn)行這些線程妹蔽。
static ExecutorService newFixedThreadPool(int nThreads)
// 創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池,以共享的無(wú)界隊(duì)列方式來(lái)運(yùn)行這些線程挠将,在需要時(shí)使用提供的 ThreadFactory 創(chuàng)建新線程胳岂。
static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
// 創(chuàng)建一個(gè)線程池,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行舔稀。
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
// 創(chuàng)建一個(gè)線程池乳丰,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
// 創(chuàng)建一個(gè)使用單個(gè) worker 線程的 Executor内贮,以無(wú)界隊(duì)列方式來(lái)運(yùn)行該線程产园。
static ExecutorService newSingleThreadExecutor()
// 創(chuàng)建一個(gè)使用單個(gè) worker 線程的 Executor,以無(wú)界隊(duì)列方式來(lái)運(yùn)行該線程夜郁,并在需要時(shí)使用提供的 ThreadFactory 創(chuàng)建新線程淆两。
static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)
// 創(chuàng)建一個(gè)單線程執(zhí)行程序,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行拂酣。
static ScheduledExecutorService newSingleThreadScheduledExecutor()
// 創(chuàng)建一個(gè)單線程執(zhí)行程序秋冰,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。
static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
// 返回 Callable 對(duì)象婶熬,調(diào)用它時(shí)可在當(dāng)前的訪問(wèn)控制上下文中執(zhí)行給定的 callable 對(duì)象剑勾。
static <T> Callable<T> privilegedCallable(Callable<T> callable)
// 返回 Callable 對(duì)象,調(diào)用它時(shí)可在當(dāng)前的訪問(wèn)控制上下文中赵颅,使用當(dāng)前上下文類加載器作為上下文類加載器來(lái)執(zhí)行給定的 callable 對(duì)象虽另。
static <T> Callable<T> privilegedCallableUsingCurrentClassLoader(Callable<T> callable)
// 返回用于創(chuàng)建新線程的線程工廠,這些新線程與當(dāng)前線程具有相同的權(quán)限饺谬。
static ThreadFactory privilegedThreadFactory()
// 返回一個(gè)將所有已定義的 ExecutorService 方法委托給指定執(zhí)行程序的對(duì)象捂刺,但是使用強(qiáng)制轉(zhuǎn)換可能無(wú)法訪問(wèn)其他方法。
static ExecutorService unconfigurableExecutorService(ExecutorService executor)
// 返回一個(gè)將所有已定義的 ExecutorService 方法委托給指定執(zhí)行程序的對(duì)象募寨,但是使用強(qiáng)制轉(zhuǎn)換可能無(wú)法訪問(wèn)其他方法族展。
static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor)

線程池舉例

package com.test;

import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableFuture;

import javax.management.monitor.Monitor;

import sun.misc.Unsafe;

public class Test {
    
    
    
    public static void main(String[] args) {
        //創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池
        ExecutorService pool = Executors.newFixedThreadPool(2);
        
        Thread t1 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+ " is running.");
            }
        });
        
        Thread t2 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+ " is running.");
            }
        });
        
        pool.execute(t1);
        pool.execute(t2);
        
        pool.shutdown();
    }
}

結(jié)果如下:


注意

如果只是調(diào)用thread或者runnable的run方法,相當(dāng)于普通的函數(shù)調(diào)用拔鹰,并不會(huì)新起一個(gè)線程仪缸。

參考資料

https://www.cnblogs.com/skywang12345/p/3509903.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市列肢,隨后出現(xiàn)的幾起案子恰画,更是在濱河造成了極大的恐慌宾茂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴还,死亡現(xiàn)場(chǎng)離奇詭異跨晴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)片林,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門端盆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拇厢,你說(shuō)我怎么就攤上這事∩古纾” “怎么了孝偎?”我有些...
    開(kāi)封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凉敲。 經(jīng)常有香客問(wèn)我衣盾,道長(zhǎng),這世上最難降的妖魔是什么爷抓? 我笑而不...
    開(kāi)封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任势决,我火速辦了婚禮,結(jié)果婚禮上蓝撇,老公的妹妹穿的比我還像新娘果复。我一直安慰自己,他們只是感情好渤昌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布虽抄。 她就那樣靜靜地躺著,像睡著了一般独柑。 火紅的嫁衣襯著肌膚如雪迈窟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天忌栅,我揣著相機(jī)與錄音车酣,去河邊找鬼。 笑死索绪,一個(gè)胖子當(dāng)著我的面吹牛湖员,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瑞驱,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼破衔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了钱烟?” 一聲冷哼從身側(cè)響起晰筛,我...
    開(kāi)封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嫡丙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后读第,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曙博,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年父泳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡藕各,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出誉碴,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布荸百,位于F島的核電站蓝翰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一剩失、第九天 我趴在偏房一處隱蔽的房頂上張望演熟。 院中可真熱鬧,春花似錦大溜、人聲如沸化漆。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)座云。三九已至,卻和暖如春付材,著一層夾襖步出監(jiān)牢的瞬間朦拖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工厌衔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留璧帝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓富寿,卻偏偏與公主長(zhǎng)得像睬隶,于是被迫代替她去往敵國(guó)和親锣夹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容