真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中有幾種線(xiàn)程池

這篇文章主要講解了“Java中有幾種線(xiàn)程池”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java中有幾種線(xiàn)程池”吧!

成都創(chuàng)新互聯(lián)成立于2013年,先為茌平等服務(wù)建站,茌平等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為茌平企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

線(xiàn)程池,顧名思義,放線(xiàn)程的池子嘛,這個(gè)池子可以存放多少線(xiàn)程取決于你自己采用什么樣的線(xiàn)程池,你的硬件資源,以及并發(fā)線(xiàn)程的數(shù)量。JDK提供了下面的四種線(xiàn)程池:

固定線(xiàn)程數(shù)的線(xiàn)程池
  1.  最簡(jiǎn)單的

在Java中創(chuàng)建一個(gè)線(xiàn)程池,這很簡(jiǎn)單,只需要兩行代碼。

ExecutorService executor = Executor.newFixedTreadPool(6);//固定線(xiàn)程是6//線(xiàn)程一般設(shè)置成processor核心數(shù)的倍數(shù),因?yàn)槲疫@臺(tái)機(jī)器是6核的,所以設(shè)成6。這也是充分利用硬件嘛
//執(zhí)行線(xiàn)程任務(wù)executor.execute(new Runnable(){@Overridepublic void run(){     //do nothing }})    executor.shutdown();

Executor是Java并發(fā)包中提供的,用來(lái)創(chuàng)造不同類(lèi)型的線(xiàn)程池。

Attention

但是在多人合作或者是一些部署上線(xiàn)的項(xiàng)目里,是不允許去使用這種方法的,因?yàn)樗怯行阅茈[患的。

Executors在創(chuàng)建線(xiàn)程池的時(shí)候,用的是new LinkedBlockingQueue(),它這個(gè)隊(duì)列本身是無(wú)邊界的,但是線(xiàn)程是固定數(shù)量的。這就意味著,在程序運(yùn)行的過(guò)程中,最多會(huì)有N個(gè)線(xiàn)程在處于活動(dòng)狀態(tài)。每次有新的任務(wù)來(lái)就會(huì)等待,直到有線(xiàn)程處于空閑狀態(tài)。所有的線(xiàn)程都會(huì)處于線(xiàn)程池里里面,直到shutdown()的執(zhí)行。

它的問(wèn)題就在于來(lái)者不拒,只要有任務(wù)來(lái),你就進(jìn)隊(duì)列等著。在入隊(duì)列和出隊(duì)列用的并不是同一個(gè)lock,在多processor的機(jī)器上,是可以做到真正意義上的并行的。拿經(jīng)典的生產(chǎn)者和消費(fèi)者來(lái)舉例子,在同一個(gè)時(shí)間點(diǎn),有的在消費(fèi),有的在生產(chǎn)。

這種線(xiàn)程池不會(huì)銷(xiāo)毀線(xiàn)程,不會(huì)拒絕任務(wù),固定線(xiàn)程數(shù)。所以如果不停的加入任務(wù),會(huì)導(dǎo)致很糟糕的內(nèi)存占用,老年代可能會(huì)被占滿(mǎn)。

  1.  稍復(fù)雜的(可以延時(shí)執(zhí)行,也可以執(zhí)行帶返回值的任務(wù))

public static void main(String[] args) throws InterruptedException, ExecutionException {        TestThread testThread = new TestThread();        System.out.println(testThread.processors);
       ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(6);        FutureTask futureTask = new FutureTask<>(new Callable() {            @Override            public String call() throws Exception {                return Thread.currentThread().getName();            }        });        scheduledExecutorService.submit(futureTask);
       //獲取返回值        String result = futureTask.get();        System.out.println("result :"+result);
       //執(zhí)行延時(shí)任務(wù)        scheduledExecutorService.schedule(new Runnable() {            @Override            public void run() {                System.out.println(Thread.currentThread().getName()+": bomb!");            }        },3L,TimeUnit.SECONDS);    }

Output:

result :pool-1-thread-1
pool-1-thread-1: bomb!

緩存的線(xiàn)程池

核心池大小為0,線(xiàn)程池最大線(xiàn)程數(shù)目為最大整型,這意味著所有的任務(wù)一提交就會(huì)wait。當(dāng)線(xiàn)程池中的線(xiàn)程有60s沒(méi)有執(zhí)行任務(wù)就會(huì)被Kill,阻塞隊(duì)列為SynchronousQueue。SynchronousQueue的take操作需要put操作等待,put操作需要take操作等待,否則會(huì)阻塞(線(xiàn)程池的阻塞隊(duì)列不能存儲(chǔ),所以當(dāng)目前線(xiàn)程處理忙碌狀態(tài)時(shí),會(huì)開(kāi)辟新的線(xiàn)程來(lái)處理請(qǐng)求**),線(xiàn)程進(jìn)入wait set。

總結(jié)一下這是一個(gè)可以無(wú)限擴(kuò)大的線(xiàn)程池;適合處理執(zhí)行時(shí)間比較小的任務(wù);線(xiàn)程空閑時(shí)間超過(guò)60s就會(huì)被Kill,所以長(zhǎng)時(shí)間處于空閑狀態(tài)的時(shí)候,這種線(xiàn)程池幾乎不占用資源,因?yàn)樗鼔焊鶝](méi)有線(xiàn)程在里面;阻塞隊(duì)列沒(méi)有存儲(chǔ)空間,只要請(qǐng)求到來(lái),就必須找到一條空閑線(xiàn)程去處理這個(gè)請(qǐng)求,找不到則在線(xiàn)程池新開(kāi)辟一條線(xiàn)程。

如果主線(xiàn)程提交任務(wù)的速度遠(yuǎn)遠(yuǎn)大于CachedThreadPool的處理速度,則CachedThreadPool會(huì)不斷地創(chuàng)建新線(xiàn)程來(lái)執(zhí)行任務(wù),這樣有可能會(huì)導(dǎo)致系統(tǒng)耗盡CPU和內(nèi)存資源,所以在使用該線(xiàn)程池時(shí),要注意控制并發(fā)的任務(wù)數(shù)。如果是一個(gè)不斷增長(zhǎng)的任務(wù)需求,很容易就會(huì)到性能瓶頸,它會(huì)不停的創(chuàng)建新的線(xiàn)程。

 ExecutorService cachedThreadPool = Executors.newCachedThreadPool();        for (int i = 0; i < 10; i++) {            cachedThreadPool.execute(new Runnable() {                @Override                public void run() {                    System.out.println(Thread.currentThread().getName());                }            });        }        cachedThreadPool.shutdown();

Output:

pool-1-thread-2
pool-1-thread-6
pool-1-thread-1
pool-1-thread-7
pool-1-thread-8
pool-1-thread-3
pool-1-thread-5
pool-1-thread-9
pool-1-thread-4
pool-1-thread-10

單個(gè)線(xiàn)程的線(xiàn)程池

SingleThreadExecutor 是使用單個(gè)worker線(xiàn)程的Executor。只有一種情況會(huì)有新的線(xiàn)程加入線(xiàn)程池,那就是原有的線(xiàn)程運(yùn)行時(shí)有拋出異常,這時(shí)就會(huì)有創(chuàng)建的新的線(xiàn)程來(lái)替代它的工作。

拿生產(chǎn)者消費(fèi)者模型來(lái)說(shuō)的話(huà),這就是一個(gè)單一消費(fèi)者的模型。

(ps.一般可以用來(lái)做一些日志記錄

 public static void main(String[] args) {        // 永遠(yuǎn)是一條線(xiàn)程        ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();        for (int i = 0; i < 10; i++) {            final int j = i;            singleThreadPool.execute(new Runnable() {                @Override                public void run() {                    System.out.println(Thread.currentThread().getName() + ":" + j);                }            });        }        singleThreadPool.shutdown();            }

Output:

pool-1-thread-1:0
pool-1-thread-1:1
pool-1-thread-1:2
pool-1-thread-1:3
pool-1-thread-1:4
pool-1-thread-1:5
pool-1-thread-1:6
pool-1-thread-1:7
pool-1-thread-1:8
pool-1-thread-1:9

感謝各位的閱讀,以上就是“Java中有幾種線(xiàn)程池”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java中有幾種線(xiàn)程池這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


名稱(chēng)欄目:Java中有幾種線(xiàn)程池
本文來(lái)源:http://weahome.cn/article/pihhep.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部