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

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

Java線程池的使用方法

本篇內(nèi)容主要講解“Java線程池的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java線程池的使用方法”吧!

在子洲等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),子洲網(wǎng)站建設(shè)費(fèi)用合理。

在任務(wù)與執(zhí)行策略之間的隱形耦合

依賴任務(wù)

使用線程封閉機(jī)制的任務(wù)

對相應(yīng)時間敏感的任務(wù)

使用ThreadLocal的任務(wù)

在線程池中,如果任務(wù)依賴于其他任務(wù),那么可能產(chǎn)生死鎖。

程序清單8-1 在單線程中任務(wù)發(fā)生死鎖

public class ThreadDeadLock {

    Executor executor = Executors.newSingleThreadExecutor();

    public class RenderPageTask implements Callable {
        @Override
        public String call() throws Exception {
            Future header, footer;
            header = executor.execute(new LoadFileTask("header.html"));
            footer = executor.execute(new LoadFileTask("footer.html"));
            
            String page = renderBody();
            //將發(fā)生死鎖 -- 由于任務(wù)在等待子任務(wù)的結(jié)果
            return header.get() + page + footer.get();
        }
    }
}

每當(dāng)提交一個有依賴性的Executor任務(wù)時,要清楚地知道可能會出現(xiàn)線程"饑餓"死鎖,因此需要在代碼或配置Executor的配置文件中記錄線程池的大小限制或配置限制。

 除了在線程池大小上的顯示限制外,還可能由于其他資源上的約束而存在一些隱式限制。如果應(yīng)用程序使用一個包含10個連接的JDBC連接池,并且每個任務(wù)需要一個數(shù)據(jù)庫連接,那么線程池就好像只有10個線程,因為當(dāng)超過10個任務(wù)時,新的任務(wù)需要等待其他任務(wù)釋放連接。

運(yùn)行時間較長的任務(wù)

設(shè)置線程池的大小

配置ThreadPoolExecutor

ThreadPoolExecutor是線程池的真正實現(xiàn),它構(gòu)造方法提供了一系列參數(shù)來配置線程池。

public ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory) {...}

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHander hander) {...}

corePoolSize--線程池的核心線程數(shù),默認(rèn)情況下,核心線程會在線程池中一直存活,即使他們處于限制狀態(tài)。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性

設(shè)置為true,那么閑置的線程核心線程在等待新任務(wù)到來時會有超時策略,這個時間間隔由keepAliveTime所指定,當(dāng)?shù)却龝r間超出keepAliveTime所指定的時長后,核心線程就會被終止。

maximumPoolSize--線程池所能容納的最大線程數(shù),當(dāng)活動線程數(shù)達(dá)到這個數(shù)值后,后續(xù)的新任務(wù)將會被阻塞。

keepAliveTime--非核心線程閑置的超時時長,超過這個時長,非核心線程就會被回收。當(dāng)ThreadPoolExecutor的屬性allowCoreThreadTimeOut值為true時,keepAliveTime也作用于核心現(xiàn)程。

unit--用于指定keepAliveTime時間參數(shù)的單位,這是一個枚舉,常用的有TimeOut.MILLISECONDS(毫秒)、TimeOut.SECONDS(秒)以及TimeOut.MINUTES(分鐘)等。

workQueue--線程池中的任務(wù)隊列,通過線程池的executor方法提交的Runnable對象會存儲在這個參數(shù)中。

threadFactory--線程工廠,為線程池提供創(chuàng)建新線程的功能。ThreadFactory是一個接口,它只有一個方法:Thread newThread(Runnable r);

hander--不常用就不做介紹了。

ThreadPoolExecutor執(zhí)行任務(wù)時大致遵循如下規(guī)則:

1 如果線程池中的線程數(shù)未達(dá)到核心數(shù)量,那么會直接啟動一個核心線程來執(zhí)行任務(wù)。

2 如果線程池中的線程數(shù)已達(dá)到或者超過核心數(shù)量,那么任務(wù)會被插入到任務(wù)隊列中排隊等待執(zhí)行。

3 如果在步驟2中無法將任務(wù)插入到任務(wù)隊列中,這往往是由于任務(wù)隊列已滿,這個時候如果線程數(shù)量未達(dá)到線程規(guī)定的最大值,那么會立刻啟動一個非核心線程來執(zhí)行任務(wù)。

4 如果步驟3中線程數(shù)量已經(jīng)達(dá)到線程池規(guī)定的最大值,那么就拒絕執(zhí)行任務(wù),ThreadPoolExecutor會調(diào)用RejectedExecutionHander的rejectedExecution方法來通知調(diào)用者。

到此,相信大家對“Java線程池的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


名稱欄目:Java線程池的使用方法
網(wǎng)址分享:http://weahome.cn/article/jppjid.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部