本篇文章為大家展示了Java中怎么使用Executor框架,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)公司是一家專(zhuān)注于成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),洪山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:洪山等地區(qū)。洪山做網(wǎng)站價(jià)格咨詢(xún):028-86922220
引入線(xiàn)程池
任務(wù)是一組邏輯工作單元,線(xiàn)程則是使任務(wù)異步執(zhí)行的機(jī)制。當(dāng)存在大量并發(fā)任務(wù)時(shí),創(chuàng)建、銷(xiāo)毀線(xiàn)程需要很大的開(kāi)銷(xiāo),運(yùn)用線(xiàn)程池可以大大減小開(kāi)銷(xiāo)。
Executor框架

說(shuō)明:
Executor 執(zhí)行器接口,該接口定義執(zhí)行Runnable任務(wù)的方式。
ExecutorService 該接口定義提供對(duì)Executor的服務(wù)。
ScheduledExecutorService 定時(shí)調(diào)度接口。
AbstractExecutorService 執(zhí)行框架抽象類(lèi)。
ThreadPoolExecutor JDK中線(xiàn)程池的具體實(shí)現(xiàn)。
Executors 線(xiàn)程池工廠類(lèi)。
ThreadPoolExecutor線(xiàn)程池類(lèi)
線(xiàn)程池是一個(gè)復(fù)雜的任務(wù)調(diào)度工具,它涉及到任務(wù)、線(xiàn)程池等的生命周期問(wèn)題。要配置一個(gè)線(xiàn)程池是比較復(fù)雜的,尤其是對(duì)于線(xiàn)程池的原理不是很清楚的情況下,很有可能配置的線(xiàn)程池不是較優(yōu)的。
JDK中的線(xiàn)程池均由ThreadPoolExecutor類(lèi)實(shí)現(xiàn)。其構(gòu)造方法如下:

參數(shù)說(shuō)明:
corePoolSize:核心線(xiàn)程數(shù)。
maximumPoolSize:最大線(xiàn)程數(shù)。
keepAliveTime:線(xiàn)程存活時(shí)間。當(dāng)線(xiàn)程數(shù)大于core數(shù),那么超過(guò)該時(shí)間的線(xiàn)程將會(huì)被終結(jié)。
unit:keepAliveTime的單位。java.util.concurrent.TimeUnit類(lèi)存在靜態(tài)靜態(tài)屬性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS
workQueue:Runnable的阻塞隊(duì)列。若線(xiàn)程池已經(jīng)被占滿(mǎn),則該隊(duì)列用于存放無(wú)法再放入線(xiàn)程池中的Runnable。
另一個(gè)構(gòu)造方法:
復(fù)制代碼 代碼如下:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
該方法在下面的擴(kuò)展部分有更深入的講解。其中handler表示線(xiàn)程池對(duì)拒絕任務(wù)的處理策略。
ThreadPoolExecutor的使用需要注意以下概念:
若線(xiàn)程池中的線(xiàn)程數(shù)量小于corePoolSize,即使線(xiàn)程池中的線(xiàn)程都處于空閑狀態(tài),也要?jiǎng)?chuàng)建新的線(xiàn)程來(lái)處理被添加的任務(wù)。
若線(xiàn)程池中的線(xiàn)程數(shù)量等于 corePoolSize且緩沖隊(duì)列 workQueue未滿(mǎn),則任務(wù)被放入緩沖隊(duì)列。
若線(xiàn)程池中線(xiàn)程的數(shù)量大于corePoolSize且緩沖隊(duì)列workQueue滿(mǎn),且線(xiàn)程池中的數(shù)量小于maximumPoolSize,則建新的線(xiàn)程來(lái)處理被添加的任務(wù)。
若線(xiàn)程池中線(xiàn)程的數(shù)量大于corePoolSize且緩沖隊(duì)列workQueue滿(mǎn),且線(xiàn)程池中的數(shù)量等于maximumPoolSize,那么通過(guò) handler所指定的策略來(lái)處理此任務(wù)。
當(dāng)線(xiàn)程池中的線(xiàn)程數(shù)量大于corePoolSize時(shí),如果某線(xiàn)程空閑時(shí)間超過(guò)keepAliveTime,線(xiàn)程將被終止。
Executors 工廠方法
JDK內(nèi)部提供了五種最常見(jiàn)的線(xiàn)程池。由Executors類(lèi)的五個(gè)靜態(tài)工廠方法創(chuàng)建。
newFixedThreadPool(...)
newSingleThreadExecutor(...)
newCachedThreadPool(...)
newScheduledThreadPool(...)
newSingleThreadScheduledExecutor()
單線(xiàn)程的線(xiàn)程池newSingleThreadExecutor
這個(gè)線(xiàn)程池只有一個(gè)線(xiàn)程在工作,也就是相當(dāng)于單線(xiàn)程串行執(zhí)行所有任務(wù)。

返回單線(xiàn)程的Executor,將多個(gè)任務(wù)交給此Exector時(shí),這個(gè)線(xiàn)程處理完一個(gè)任務(wù)后接著處理下一個(gè)任務(wù),若該線(xiàn)程出現(xiàn)異常,將會(huì)有一個(gè)新的線(xiàn)程來(lái)替代。此線(xiàn)程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。
說(shuō)明:LinkedBlockingQueue會(huì)無(wú)限的添加需要執(zhí)行的Runnable。
創(chuàng)建固定大小的線(xiàn)程池newFixedThreadPool
每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線(xiàn)程,直到線(xiàn)程達(dá)到線(xiàn)程池的最大大小。線(xiàn)程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線(xiàn)程因?yàn)閳?zhí)行異常而結(jié)束,那么線(xiàn)程池會(huì)補(bǔ)充一個(gè)新線(xiàn)程。
public static ExecutorSevice newFixedThreadPool()
返回一個(gè)包含指定數(shù)目線(xiàn)程的線(xiàn)程池,如果任務(wù)數(shù)量多于線(xiàn)程數(shù)目,那么沒(méi)有沒(méi)有執(zhí)行的任務(wù)必須等待,直到有任務(wù)完成為止。
可緩存的線(xiàn)程池newCachedThreadPool
如果線(xiàn)程池的大小超過(guò)了處理任務(wù)所需要的線(xiàn)程,那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線(xiàn)程,當(dāng)任務(wù)數(shù)增加時(shí),此線(xiàn)程池又可以智能的添加新線(xiàn)程來(lái)處理任務(wù)。此線(xiàn)程池不會(huì)對(duì)線(xiàn)程池大小做限制,線(xiàn)程池大小完全依賴(lài)于操作系統(tǒng)(或者說(shuō)JVM)能夠創(chuàng)建的最大線(xiàn)程大小。

newCachedThreadPool方法創(chuàng)建的線(xiàn)程池可以自動(dòng)的擴(kuò)展線(xiàn)程池的容量。核心線(xiàn)程數(shù)量為0。
SynchronousQueue是個(gè)特殊的隊(duì)列。SynchronousQueue隊(duì)列的容量為0。當(dāng)試圖為SynchronousQueue添加Runnable,則執(zhí)行會(huì)失敗。只有當(dāng)一邊從SynchronousQueue取數(shù)據(jù),一邊向SynchronousQueue添加數(shù)據(jù)才可以成功。SynchronousQueue僅僅起到數(shù)據(jù)交換的作用,并不保存線(xiàn)程。但newCachedThreadPool()方法沒(méi)有線(xiàn)程上限。Runable添加到SynchronousQueue會(huì)被立刻取出。
根據(jù)用戶(hù)的任務(wù)數(shù)創(chuàng)建相應(yīng)的線(xiàn)程來(lái)處理,該線(xiàn)程池不會(huì)對(duì)線(xiàn)程數(shù)目加以限制,完全依賴(lài)于JVM能創(chuàng)建線(xiàn)程的數(shù)量,可能引起內(nèi)存不足。
定時(shí)任務(wù)調(diào)度的線(xiàn)程池newScheduledThreadPool
創(chuàng)建一個(gè)大小無(wú)限的線(xiàn)程池。此線(xiàn)程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。
例:
public class ScheduledThreadPoolTest {
public static void main(String[] args) {
ScheduledExecutorService ses = Executors.newScheduledThreadPool(10);
ses.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new Date());
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
}
}單線(xiàn)程的定時(shí)任務(wù)調(diào)度線(xiàn)程池newSingleThreadScheduledExecutor
此線(xiàn)程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。
Executor接口
Executor是一個(gè)線(xiàn)程執(zhí)行接口。任務(wù)執(zhí)行的主要抽象不是Thead,而是Executor。
public interface Executor{
void executor(Runnable command);
}Executor將任務(wù)的提交過(guò)程與執(zhí)行過(guò)程解耦,并用Runnable來(lái)表示任務(wù)。執(zhí)行的任務(wù)放入run方法中即可,將Runnable接口的實(shí)現(xiàn)類(lèi)交給線(xiàn)程池的execute方法,作為它的一個(gè)參數(shù)。如果需要給任務(wù)傳遞參數(shù),可以通過(guò)創(chuàng)建一個(gè)Runnable接口的實(shí)現(xiàn)類(lèi)來(lái)完成。
Executor可以支持多種不同類(lèi)型的任務(wù)執(zhí)行策略。
Executor基于生產(chǎn)者消費(fèi)者模式,提交任務(wù)的操作相當(dāng)于生產(chǎn)者,執(zhí)行任務(wù)的線(xiàn)程則相當(dāng)于消費(fèi)者。
ExecutorService接口
線(xiàn)程池接口。ExecutorService在Executor的基礎(chǔ)上增加了一些方法,其中有兩個(gè)核心的方法:
Future<?> submit(Runnable task) <T> Future<T> submit(Callable<T> task)
這兩個(gè)方法都是向線(xiàn)程池中提交任務(wù),它們的區(qū)別在于Runnable在執(zhí)行完畢后沒(méi)有結(jié)果,Callable執(zhí)行完畢后有一個(gè)結(jié)果。這在多個(gè)線(xiàn)程中傳遞狀態(tài)和結(jié)果是非常有用的。另外他們的相同點(diǎn)在于都返回一個(gè)Future對(duì)象。Future對(duì)象可以阻塞線(xiàn)程直到運(yùn)行完畢(獲取結(jié)果,如果有的話(huà)),也可以取消任務(wù)執(zhí)行,當(dāng)然也能夠檢測(cè)任務(wù)是否被取消或者是否執(zhí)行完畢。
在沒(méi)有Future之前我們檢測(cè)一個(gè)線(xiàn)程是否執(zhí)行完畢通常使用Thread.join()或者用一個(gè)死循環(huán)加狀態(tài)位來(lái)描述線(xiàn)程執(zhí)行完畢。現(xiàn)在有了更好的方法能夠阻塞線(xiàn)程,檢測(cè)任務(wù)執(zhí)行完畢甚至取消執(zhí)行中或者未開(kāi)始執(zhí)行的任務(wù)。
ScheduledExecutorService接口
ScheduledExecutorService描述的功能和Timer/TimerTask類(lèi)似,解決那些需要任務(wù)重復(fù)執(zhí)行的問(wèn)題。這包括延遲時(shí)間一次性執(zhí)行、延遲時(shí)間周期性執(zhí)行以及固定延遲時(shí)間周期性執(zhí)行等。當(dāng)然了繼承ExecutorService的ScheduledExecutorService擁有ExecutorService的全部特性。
線(xiàn)程池生命周期
線(xiàn)程是有多種執(zhí)行狀態(tài)的,同樣管理線(xiàn)程的線(xiàn)程池也有多種狀態(tài)。JVM會(huì)在所有線(xiàn)程(非后臺(tái)daemon線(xiàn)程)全部終止后才退出,為了節(jié)省資源和有效釋放資源關(guān)閉一個(gè)線(xiàn)程池就顯得很重要。有時(shí)候無(wú)法正確的關(guān)閉線(xiàn)程池,將會(huì)阻止JVM的結(jié)束。
線(xiàn)程池Executor是異步的執(zhí)行任務(wù),因此任何時(shí)刻不能夠直接獲取提交的任務(wù)的狀態(tài)。這些任務(wù)有可能已經(jīng)完成,也有可能正在執(zhí)行或者還在排隊(duì)等待執(zhí)行。因此關(guān)閉線(xiàn)程池可能出現(xiàn)一下幾種情況:
平緩關(guān)閉:已經(jīng)啟動(dòng)的任務(wù)全部執(zhí)行完畢,同時(shí)不再接受新的任務(wù)。
立即關(guān)閉:取消所有正在執(zhí)行和未執(zhí)行的任務(wù)。
另外關(guān)閉線(xiàn)程池后對(duì)于任務(wù)的狀態(tài)應(yīng)該有相應(yīng)的反饋信息。
啟動(dòng)線(xiàn)程池
線(xiàn)程池在構(gòu)造前(new操作)是初始狀態(tài),一旦構(gòu)造完成線(xiàn)程池就進(jìn)入了執(zhí)行狀態(tài)RUNNING。嚴(yán)格意義上講線(xiàn)程池構(gòu)造完成后并沒(méi)有線(xiàn)程被立即啟動(dòng),只有進(jìn)行"預(yù)啟動(dòng)"或者接收到任務(wù)的時(shí)候才會(huì)啟動(dòng)線(xiàn)程。
線(xiàn)程池是處于運(yùn)行狀態(tài),隨時(shí)準(zhǔn)備接受任務(wù)來(lái)執(zhí)行。
關(guān)閉線(xiàn)程池
線(xiàn)程池運(yùn)行中可以通過(guò)shutdown()和shutdownNow()來(lái)改變運(yùn)行狀態(tài)。
shutdown():平緩的關(guān)閉線(xiàn)程池。線(xiàn)程池停止接受新的任務(wù),同時(shí)等待已經(jīng)提交的任務(wù)執(zhí)行完畢,包括那些進(jìn)入隊(duì)列還沒(méi)有開(kāi)始的任務(wù)。shutdown()方法執(zhí)行過(guò)程中,線(xiàn)程池處于SHUTDOWN狀態(tài)。
shutdownNow():立即關(guān)閉線(xiàn)程池。線(xiàn)程池停止接受新的任務(wù),同時(shí)線(xiàn)程池取消所有執(zhí)行的任務(wù)和已經(jīng)進(jìn)入隊(duì)列但是還沒(méi)有執(zhí)行的任務(wù)。shutdownNow()方法執(zhí)行過(guò)程中,線(xiàn)程池處于STOP狀態(tài)。shutdownNow方法本質(zhì)是調(diào)用Thread.interrupt()方法。但我們知道該方法僅僅是讓線(xiàn)程處于interrupted狀態(tài),并不會(huì)讓線(xiàn)程真正的停止!所以若只調(diào)用或只調(diào)用一次shutdownNow()方法,不一定會(huì)讓線(xiàn)程池中的線(xiàn)程都關(guān)閉掉,線(xiàn)程中必須要有處理interrupt事件的機(jī)制。
線(xiàn)程池結(jié)束
一旦shutdown()或者shutdownNow()執(zhí)行完畢,線(xiàn)程池就進(jìn)入TERMINATED狀態(tài),即線(xiàn)程池就結(jié)束了。
isTerminating() 如果關(guān)閉后所有任務(wù)都已完成,則返回true。
isShutdown() 如果此執(zhí)行程序已關(guān)閉,則返回true。
例:使用固定大小的線(xiàn)程池。并將任務(wù)添加到線(xiàn)程池。
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class JavaThreadPool {
public static void main(String[] args) {
// 創(chuàng)建一個(gè)可重用固定線(xiàn)程數(shù)的線(xiàn)程池
ExecutorService pool = Executors.newFixedThreadPool(2);
// 創(chuàng)建實(shí)現(xiàn)了Runnable接口對(duì)象,Thread對(duì)象當(dāng)然也實(shí)現(xiàn)了Runnable接口
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
// 將線(xiàn)程放入池中進(jìn)行執(zhí)行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
// 關(guān)閉線(xiàn)程池
pool.shutdown();
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "正在執(zhí)行。。。");
}
}
Java線(xiàn)程池?cái)U(kuò)展
ThreadPoolExecutor線(xiàn)程池的執(zhí)行監(jiān)控
ThreadPoolExecutor中定義了三個(gè)空方法,用于監(jiān)控線(xiàn)程的執(zhí)行情況。
ThreadPoolExecutor源碼:
protected void beforeExecute(Thread t, Runnable r) { }
protected void afterExecute(Runnable r, Throwable t) { }
protected void terminated() { }例:使用覆蓋方法,定義新的線(xiàn)程池。
public class ExtThreadPoolTest {
static class MyTask implements Runnable {
public String name;
public MyTask(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(500);
System.out.println("執(zhí)行中:"+this.name);
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService es = new ThreadPoolExecutor(5,5,0,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()){
@Override
protected void beforeExecute(Thread t, Runnable r) {
System.out.println("準(zhǔn)備執(zhí)行:" + ((MyTask)r).name);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
System.out.println("執(zhí)行完成:" + ((MyTask)r).name);
}
@Override
protected void terminated() {
System.out.println("執(zhí)行退出");
}
};
for(int i=0;i<5;i++){
MyTask task = new MyTask("Task-"+i);
es.execute(task);
}
Thread.sleep(10); // 等待terminated()執(zhí)行
es.shutdown(); // 若無(wú)該方法,主線(xiàn)程不會(huì)結(jié)束。
}
}ThreadPoolExecutor的拒絕策略
線(xiàn)程池不可能處理無(wú)限多的線(xiàn)程。所以一旦線(xiàn)程池中中需要執(zhí)行的任務(wù)過(guò)多,線(xiàn)程池對(duì)于某些任務(wù)就無(wú)法處理了。拒絕策略即對(duì)這些無(wú)法處理的任務(wù)進(jìn)行處理。可能丟棄掉這些不能處理的任務(wù),也可能用其他方式。
ThreadPoolExecutor類(lèi)還有另一個(gè)構(gòu)造方法。該構(gòu)造方法中的RejectedExecutionHandler用于定義拒絕策略。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
.....
}JDK內(nèi)部已經(jīng)提供一些拒絕策略。

AbortPolicy一旦線(xiàn)程不能處理,則拋出異常。
AbortPolicy源碼:
public static class AbortPolicy implements RejectedExecutionHandler {
/**
* Creates an {@code AbortPolicy}.
*/
public AbortPolicy() { }
/**
* Always throws RejectedExecutionException.
*
* @param r the runnable task requested to be executed
* @param e the executor attempting to execute this task
* @throws RejectedExecutionException always.
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
}DiscardPolicy一旦線(xiàn)程不能處理,則丟棄任務(wù)。
DiscardPolicy源碼:
public static class DiscardPolicy implements RejectedExecutionHandler {
/**
* Creates a {@code DiscardPolicy}.
*/
public DiscardPolicy() { }
/**
* Does nothing, which has the effect of discarding task r.
*
* @param r the runnable task requested to be executed
* @param e the executor attempting to execute this task
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
}CallerRunsPolicy一旦線(xiàn)程不能處理,則將任務(wù)返回給提交任務(wù)的線(xiàn)程處理。
CallerRunsPolicy源碼:
public static class CallerRunsPolicy implements RejectedExecutionHandler {
/**
* Creates a {@code CallerRunsPolicy}.
*/
public CallerRunsPolicy() { }
/**
* Executes task r in the caller's thread, unless the executor
* has been shut down, in which case the task is discarded.
*
* @param r the runnable task requested to be executed
* @param e the executor attempting to execute this task
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
}DiscardOldestPolicy一旦線(xiàn)程不能處理,丟棄掉隊(duì)列中最老的任務(wù)。
DiscardOldestPolicy源碼:
public static class DiscardOldestPolicy implements RejectedExecutionHandler {
/**
* Creates a {@code DiscardOldestPolicy} for the given executor.
*/
public DiscardOldestPolicy() { }
/**
* Obtains and ignores the next task that the executor
* would otherwise execute, if one is immediately available,
* and then retries execution of task r, unless the executor
* is shut down, in which case task r is instead discarded.
*
* @param r the runnable task requested to be executed
* @param e the executor attempting to execute this task
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
}例:自定義拒絕策略。打印并丟棄無(wú)法處理的任務(wù)。
public class RejectedPolicyHandleTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = new ThreadPoolExecutor(5,5,0,TimeUnit.MILLISECONDS,new SynchronousQueue<Runnable>(),Executors.defaultThreadFactory(),new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 打印并丟棄。
System.out.println(r.toString()+" is discard");
}
});
for(int i=0;i<Integer.MAX_VALUE;i++){
MyTask task = new MyTask("Task-"+i);
es.execute(task);
Thread.sleep(10);
}
es.shutdown(); // 若無(wú)該方法,主線(xiàn)程不會(huì)結(jié)束。
}
}ThreadFactory 線(xiàn)程工廠
ThreadPoolExecutor類(lèi)構(gòu)造器的參數(shù)其中之一即為T(mén)hreadFactory線(xiàn)程工廠。
ThreadFactory用于創(chuàng)建線(xiàn)程池中的線(xiàn)程。
public interface ThreadFactory {
Thread newThread(Runnable r);
}ThreadFactory的實(shí)現(xiàn)類(lèi)中一般定義線(xiàn)程了線(xiàn)程組,線(xiàn)程數(shù)與線(xiàn)程名稱(chēng)。
DefaultThreadFactory源碼:
static class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}上述內(nèi)容就是Java中怎么使用Executor框架,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
本文題目:Java中怎么使用Executor框架
網(wǎng)站URL:http://chinadenli.net/article30/ggjiso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、企業(yè)建站、網(wǎng)站設(shè)計(jì)公司、靜態(tài)網(wǎng)站、搜索引擎優(yōu)化、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)