接口Executor:
一個可以執(zhí)行被提交的Runnable的對象。該接口提供了一種任務(wù)提交的解耦方案,體現(xiàn)在每個task如何運行,使用,調(diào)度等。
Executor接口并不嚴(yán)格要求task的執(zhí)行過程是異步的,在最簡單的情況下,一個Executor可以直接將task放在調(diào)用者的線程中執(zhí)行:
class DirectExecutor implements Executor{
public void execute(Runnable r){
r.run();
}
}
但更常見的情況一般是:task會被放置在其他線程而非調(diào)用者線程執(zhí)行。
許多Executor接口的實現(xiàn)會給task如何以及何時被調(diào)用加上限制。
void execute(Runnable command);
Runnable可在新線程,線程池,或者調(diào)用者線程執(zhí)行。
接口ExecutorService(Executor的拓展)
是一個提供了termination和返回Future來追蹤一個或多個異步tasks的對象。
termination:指executor沒有正在執(zhí)行的task,沒有等待執(zhí)行的task,且沒有新的task可以被接收。
shutdown();新的task不再被接收,已提交的task會執(zhí)行完畢,重復(fù)調(diào)用該方法沒有其他效果。該方法不會阻塞調(diào)用者線程來等待task去執(zhí)行完畢,若要阻塞當(dāng)前線程,該調(diào)用awaitTermination();
shutdownNow();嘗試停止所有正在執(zhí)行的task,停止正在等待的task,返回等待執(zhí)行的task的List<Runnable>。但并不保證能成功停止正在執(zhí)行的線程,因為該方法的實現(xiàn)一般就是用Thread#interrupt(),那么就要求線程本身就能正確根據(jù)interrupt()方法來停止自身。
isShutdown()返回true如果調(diào)用過shutdown()或者shutdownNow()。
isTerminated();如果全部task都在調(diào)用shutdown()后完成了,將返回true,若調(diào)用isTerminated()之前沒有調(diào)用過shutdown()或shutdownNow(),該方法永遠(yuǎn)返回false。
awaitTermination(long timeout,Timeunit unit) throws InterruptedExeption; 阻塞調(diào)用者的線程,直到所有task在shutdown后完成,或者timeout超時,或者當(dāng)前線程被interrupted。
Future<T> submit(Callable<T>)提交一個有返回值的任務(wù)(Callble)并返回一個Future對象。可通過Future#get()來返回任務(wù)處理完成的結(jié)果。若要為獲取一個任務(wù)的執(zhí)行結(jié)果而阻塞當(dāng)前調(diào)用者線程,可以
result=exec.submit(aCallable).get();