線程池架構(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è)線程仪缸。