java創(chuàng)建線程池的幾種方式 java線程池創(chuàng)建的四種

本篇文章給大家談?wù)刯ava創(chuàng)建線程池的幾種方式,以及java線程池創(chuàng)建的四種對應(yīng)的知識(shí)點(diǎn),文章可能有點(diǎn)長,但是希望大家可以閱讀完,增長自己的知識(shí),最重要的是希望對各位有...
本篇文章給大家談?wù)刯ava創(chuàng)建線程池的幾種方式,以及java線程池創(chuàng)建的四種對應(yīng)的知識(shí)點(diǎn),文章可能有點(diǎn)長,但是希望大家可以閱讀完,增長自己的知識(shí),最重要的是希望對各位有所幫助,可以解決了您的問題,不要忘了收藏本站喔。
為什么要使用線程池
1.減少了創(chuàng)建和銷毀線程的次數(shù),每個(gè)工作線程都可以被重復(fù)利用,可執(zhí)行多個(gè)任務(wù)。
2.可以根據(jù)系統(tǒng)的承受能力,調(diào)整線程池中工作線線程的數(shù)目,防止因?yàn)橄倪^多的內(nèi)存,而把服務(wù)器累趴下(每個(gè)線程需要大約1MB內(nèi)存,線程開的越多,消耗的內(nèi)存也就越大,最后死機(jī))。
Java里面線程池的頂級(jí)接口是Executor,但是嚴(yán)格意義上講Executor并不是一個(gè)線程池,而只是一個(gè)執(zhí)行線程的工具。真正的線程池接口是ExecutorService。
菜雞求問,c++里的epoll和java里的線程池到底怎么理解,優(yōu)劣如何
服務(wù)器并發(fā)模型通??煞譃閱尉€程和多線程模型,這里的線程通常是指“I/O線程”,即負(fù)責(zé)I/O操作,協(xié)調(diào)分配任務(wù)的“管理線程”,而實(shí)際的請求和任務(wù)通常交由所謂“工作者線程”處理。通常多線程模型下,每個(gè)線程既是I/O線程又是工作者線程。所以這里討論的是,單I/O線程+多工作者線程的模型,這也是最常用的一種服務(wù)器并發(fā)模型。我所在的項(xiàng)目中的server代碼中,這種模型隨處可見。它還有個(gè)名字,叫“半同步/半異步“模型,同時(shí),這種模型也是生產(chǎn)者/消費(fèi)者(尤其是多消費(fèi)者)模型的一種表現(xiàn)。
這種架構(gòu)主要是基于I/O多路復(fù)用的思想(主要是epoll,select/poll已過時(shí)),通過單線程I/O多路復(fù)用,可以達(dá)到高效并發(fā),同時(shí)避免了多線程I/O來回切換的各種開銷,思路清晰,易于管理,而基于線程池的多工作者線程,又可以充分發(fā)揮和利用多線程的優(yōu)勢,利用線程池,進(jìn)一步提高資源復(fù)用性和避免產(chǎn)生過多線程。
epoll是linux下高并發(fā)服務(wù)器的完美方案,因?yàn)槭腔谑录|發(fā)的,所以比select快的不只是一個(gè)數(shù)量級(jí)。
單線程epoll,觸發(fā)量可達(dá)到15000,但是加上業(yè)務(wù)后,因?yàn)榇蠖鄶?shù)業(yè)務(wù)都與數(shù)據(jù)庫打交道,所以就會(huì)存在阻塞的情況,這個(gè)時(shí)候就必須用多線程來提速。
一個(gè)spring項(xiàng)目定義多少個(gè)線程池
一個(gè)spring項(xiàng)目能夠定義兩個(gè)線程:SpringFrame的ThreadPoolTaskExecutor是輔助JDK的ThreadPoolExecutor的工具類,它將屬性通過JavaBeans的命名規(guī)則提供出來,方便進(jìn)行配置。1.ThreadPoolExecutorspring中的ThreadPoolTaskExecutor是借助于JDK
多線程實(shí)現(xiàn)四種方式區(qū)別
在進(jìn)行多線程編程時(shí),通常可以采用以下四種方式來實(shí)現(xiàn):
1.繼承Thread類,重寫run()方法
這種方式需要繼承Thread類并重寫run()方法,然后通過創(chuàng)建子類對象來啟動(dòng)線程。例如:
```
publicclassMyThreadextendsThread{
@Override
publicvoidrun(){
//線程執(zhí)行代碼
}
}
publicstaticvoidmain(String[]args){
MyThreadt=newMyThread();
t.start();
}
```
2.實(shí)現(xiàn)Runnable接口
這種方式需要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)了Runnable接口的類,并重寫run()方法。然后將該實(shí)現(xiàn)類的實(shí)例作為參數(shù)傳遞給Thread類的構(gòu)造方法,并調(diào)用start()方法啟動(dòng)線程。例如:
```
publicclassMyRunnableimplementsRunnable{
@Override
publicvoidrun(){
//線程執(zhí)行代碼
}
}
publicstaticvoidmain(String[]args){
MyRunnabler=newMyRunnable();
Threadt=newThread(r);
t.start();
}
```
3.實(shí)現(xiàn)Callable接口
Callable接口類似于Runnable接口,都是用來創(chuàng)建線程的,但它比Runnable接口強(qiáng)大,可以返回執(zhí)行結(jié)果,并且可以拋出異常。需要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)了Callable接口的類,并重寫call()方法。然后可以通過創(chuàng)建ExecutorService對象來啟動(dòng)線程。例如:
```
publicclassMyCallableimplementsCallable<String>{
@Override
publicStringcall()throwsException{
//線程執(zhí)行代碼
return"result";
}
}
publicstaticvoidmain(String[]args){
MyCallablec=newMyCallable();
ExecutorServiceexecutorService=Executors.newCachedThreadPool();
Future<String>future=executorService.submit(c);
Stringresult=future.get();
}
```
4.使用線程池
在創(chuàng)建大量線程時(shí),如果每個(gè)線程都創(chuàng)建一個(gè)新的線程對象,將消耗大量的系統(tǒng)資源,此時(shí)可以使用線程池來管理線程。線程池是一種線程復(fù)用的方法,它可以預(yù)先創(chuàng)建一定數(shù)量的線程,并將任務(wù)提交給線程池,由線程池中的空閑線程來執(zhí)行任務(wù)。例如:
```
publicstaticvoidmain(String[]args){
ExecutorServiceexecutorService=Executors.newFixedThreadPool(10);
for(inti=0;i<100;i++){
executorService.submit(newRunnable(){
@Override
publicvoidrun(){
//線程執(zhí)行代碼
}
});
}
executorService.shutdown();
}
```
這四種方式的區(qū)別主要在于實(shí)現(xiàn)方式的不同,功能上基本相同,都可以用來創(chuàng)建和啟動(dòng)線程,但底層實(shí)現(xiàn)不同。比如,使用Runnable接口的方式可以讓多個(gè)線程共享同一個(gè)Runnable對象,而使用Callable接口可以返回執(zhí)行結(jié)果和拋出異常等。使用線程池可以提高線程的復(fù)用性,減小系統(tǒng)開銷等。
線程池能處理多少個(gè)任務(wù)
2048個(gè)任務(wù),創(chuàng)建線程要花費(fèi)昂貴的資源和時(shí)間,如果任務(wù)來了才創(chuàng)建線程那么響應(yīng)時(shí)間會(huì)變長,而且一個(gè)進(jìn)程能創(chuàng)建的線程數(shù)有限。
為了避免這些問題,在程序啟動(dòng)的時(shí)候就創(chuàng)建若干線程來響應(yīng)處理,它們被稱為線程池,里面的線程叫工作線程。從JDK1.5開始,JavaAPI提供了Executor框架讓你可以創(chuàng)建不同的線程池。比如單線程池,每次處理一個(gè)任務(wù);數(shù)目固定的線程池或者是緩存線程池(一個(gè)適合很多生存期短的任務(wù)的程序的可擴(kuò)展線程池)。
如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
本文鏈接:http://xinin56.com/kaifa/3505.html