Java多執行緒之Executor框架

2021-08-02 11:52:54 字數 2384 閱讀 9986

executor executor = executors.newfixedthreadpool(10);  

runnable task = new runnable()

};

executor.execute(task);

executor = executors.newscheduledthreadpool(10);

scheduledexecutorservice scheduler = (scheduledexecutorservice) executor;

scheduler.scheduleatfixedrate(task, 10, 10, timeunit.seconds);

executorservice擴充套件了executor並新增了一些生命週期管理的方法。乙個executor的生命週期有三種狀態,執行 ,關閉 ,終止 。executor建立時處於執行狀態。當呼叫executorservice.shutdown()後,處於關閉狀態,isshutdown()方法返回true。這時,不應該再想executor中新增任務,所有已新增的任務執行完畢後,executor處於終止狀態,isterminated()返回true。

如果executor處於關閉狀態,往executor提交任務會丟擲unchecked exception rejectedexecutionexception。

executorservice executorservice = (executorservice) executor;  

while (!executorservice.isshutdown())

catch (rejectedexecutionexception ignored)

} executorservice.shutdown();

future代表乙個非同步執行的操作,通過get()方法可以獲得操作的結果,如果非同步操作還沒有完成,則,get()會使當前執行緒阻塞。futuretask實現了future和runable。callable代表乙個有返回值得操作。

callable<

integer

> func =

new callable<

integer

>()

};

futuretask<

integer

> futuretask =

new futuretask<

integer

>(func);

thread newthread =

newthread(futuretask);

newthread.start();

try catch (interruptedexception ignored) catch (executionexception ignored)

executoreservice提供了submit()方法,傳遞乙個callable,或runnable,返回future。如果executor後台執行緒池還沒有完成callable的計算,這呼叫返回future物件的get()方法,會阻塞直到計算完成。

在剛在的例子中,getresult()方法的實現過程中,迭代了futuretask的陣列,如果任務還沒有完成則當前執行緒會阻塞,如果我們希望任意字任務完成後就把其結果加到result中,而不用依次等待每個任務完成,可以使completionservice。生產者submit()執行的任務。使用者take()已完成的任務,並按照完成這些任務的順序處理它們的結果 。也就是呼叫completionservice的take方法是,會返回按完成順序放回任務的結果,completionservice內部維護了乙個阻塞佇列blockingqueue,如果沒有任務完成,take()方法也會阻塞。修改剛才的例子使用completionservice:

public

class

concurrentcalculator2

public

concurrentcalculator2()

public long sum(final

int numbers)

} return getresult();

} /**

* 迭代每個只任務,獲得部分和,相加返回

* *@return

*/public long getresult() catch (interruptedexception e) catch (executionexception e)

} return result;

} public

void

close()

}

JAVA多執行緒之 執行緒池

執行緒池顧名思義,就是乙個放置執行緒的池子。就跟資料庫連線池差不多。執行緒池通過對併發執行緒的控制,能有效的節省系統資源的浪費,提高系統的效能。學習執行緒池,先了解一下執行緒池的乙個基本結構 executor是乙個介面,其中只有乙個方法,就是execute方法。所以executor實際就是乙個執行緒...

Java多執行緒之執行緒安全

當多個執行緒訪問某乙個類 物件或方法時 這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的。public class mythread extends thread public static void main string args 結果如下 t1正在執行 4 t1正在執行...

java 多執行緒 之 Excutor

excutor介面 提供了一種將任務提交和任務執行機制相分離的方法 excutorservice介面 提供了excutor的管理介面,以及可為跟蹤乙個或多個非同步任務狀態而生成future的方法 scheduledexcutorservice介面 提供了可以安排在給定的延遲後執行或定時執行的命令 方...