From:Java并發(fā)編程的藝術(shù)
- 目錄
BiBi - 并發(fā)編程 -0- 開篇
BiBi - 并發(fā)編程 -1- 挑戰(zhàn)
BiBi - 并發(fā)編程 -2- volatile
BiBi - 并發(fā)編程 -3- 鎖
BiBi - 并發(fā)編程 -4- 原子操作
BiBi - 并發(fā)編程 -5- Java內(nèi)存模型
BiBi - 并發(fā)編程 -6- final關(guān)鍵字
BiBi - 并發(fā)編程 -7- DCL
BiBi - 并發(fā)編程 -8- 線程
BiBi - 并發(fā)編程 -9- ReentrantLock
BiBi - 并發(fā)編程 -10- 隊列同步器
BiBi - 并發(fā)編程 -11- 并發(fā)容器
BiBi - 并發(fā)編程 -12- Fork/Join框架
BiBi - 并發(fā)編程 -13- 并發(fā)工具類
BiBi - 并發(fā)編程 -14- 線程池
BiBi - 并發(fā)編程 -15- Executor框架
Java1.5之后把線程的工作單元和執(zhí)行機制進行了分離厌衔。工作單元包括Runnable【無結(jié)果返回】和Callable【有結(jié)果返回】止邮,執(zhí)行機制由Executor框架提供夸研。
Executor可以把一個Runnable對象封裝為一個Callable對象。
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) { }
FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
SingleThreadExecutor和FixedThreadPool就前兩個參數(shù)不一樣。
CachedThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
使用SynchronousQueue沒有容量的隊列,每個插入操作必須等待另一個線程的對應(yīng)移除操作。CachedThreadPool使用SynchronousQueue榜轿,把主線程提交的任務(wù)傳遞給空閑線程來執(zhí)行【在60秒內(nèi)】。
ScheduledThreadPoolExecutor
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}
ScheduledThreadPoolExecutor繼承ThreadPoolExecutor朵锣。DelayQueue是一個無界隊列差导,它里面封裝了一個PriorityQueue,會按照時間先后順序進行排序猪勇,如果時間相同设褐,則再按照任務(wù)添加的先后順序。
執(zhí)行過程:先從DelayQueue中獲取已到期的ScheduleFutureTask進行執(zhí)行泣刹,然后修改這個任務(wù)的time變量為下次執(zhí)行的時間助析,最后將修改time后的ScheduleFutureTask放回到DelayQueue中。
FutureTask 異步計算結(jié)果
FutureTask繼承了Future接口和Runnable接口椅您。
構(gòu)造函數(shù):
FutureTask(Callable<V> callable) { }
FutureTask(Runnable runnable, V result) { }
開啟線程的方法:
//方法一:繼承于Thread
new Thread() {
@Override
public void run() {
}
}.start();
//方法二:實現(xiàn)Runnable接口
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
//方法三:FutureTask + Callable, 有結(jié)果返回
FutureTask<String> res = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
return null;
}
}).run();
//方法四:FutureTask + Runnable, 有結(jié)果返回
String result = null;
new FutureTask<String>(new Runnable() {
@Override
public void run() {
}
}, result).run();
注意:FutureTask調(diào)用run方法啟動線程而不是start方法外冀。
FutureTask使用場景:當一個線程需要等待另一線程把某個任務(wù)執(zhí)行完后才能繼續(xù)執(zhí)行。
FutureTask的實現(xiàn)基于AQS同步器掀泳。FutureTask的acquire操作對應(yīng)為get()/get(long timeout)雪隧;release操作對應(yīng)為run方法或cancel方法。