ExecutorService 類圖

ExecutorService.jpg
ExecutorService被終止后,會(huì)拒絕執(zhí)行新的任務(wù)。ExecutorService提供了2個(gè)終止方法:
-
shutdown()方法將會(huì)在終止之前執(zhí)行預(yù)先制定好要提交的任務(wù)。 -
shutdownNow()方法阻止等待執(zhí)行的任務(wù),并嘗試終止正在執(zhí)行的任務(wù)。
ExecutorService終止后,executor不會(huì)有要執(zhí)行的任務(wù),不會(huì)有等待執(zhí)行的任務(wù),也不會(huì)沒(méi)有被提交的任務(wù)。沒(méi)有被使用的ExectorService應(yīng)該被終止,以此來(lái)釋放其占用的資源。
submit方法通過(guò)創(chuàng)建并返回Future來(lái)擴(kuò)展Exector.execute(Runnable)方法,Futrue可以用來(lái)取消執(zhí)行或等待完成的任務(wù)。invokeAny和invokeAll是最常見(jiàn)的用來(lái)批量執(zhí)行任務(wù)的方法,它們通常執(zhí)行一組任務(wù),然后等待至少一個(gè)或者全部任務(wù)完成。
Executors類為這個(gè)包中的executor服務(wù)提供工廠方法。
下面的代碼展示了在網(wǎng)絡(luò)服務(wù)中使用線程池中的線程來(lái)接受網(wǎng)絡(luò)請(qǐng)求的情形。代碼中使用了Executors已經(jīng)寫(xiě)好的方法 executor.newfixedthreadpool (int):
class NetworkService implements Runnable {
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize)
throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}
// 運(yùn)行
public void run() {
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request on socket
}
}
下面的方法分兩個(gè)階段關(guān)閉ExecutorService,首先調(diào)用shutdown防止新任務(wù)被提交,然后調(diào)用shutdownNow(如果需要的話)來(lái)取消等待執(zhí)行的任務(wù):
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // 防止新任務(wù)被提交
try {
// 正在執(zhí)行的任務(wù)停止之前等待一小會(huì)
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // 取消當(dāng)前正在執(zhí)行的任務(wù)
// 被取消的任務(wù)有相應(yīng)前等待一小會(huì)
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// 如果當(dāng)前線程被打斷,重新發(fā)起取消執(zhí)行
pool.shutdownNow();
// 保持中斷狀態(tài)
Thread.currentThread().interrupt();
}
}