<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                #### 11.3.1 ThreadPoolExecutor [ThreadPoolExecutor](https://www.androidos.net.cn/android/6.0.1_r16/xref/libcore/luni/src/main/java/java/util/concurrent/ThreadPoolExecutor.java)是線程池的真正實現,它的構造方法提供了一系列參數來配置線程池,下面介紹ThreadPoolExecutor的構造方法中各個參數的含義,這些參數將會直接影響到線程池的功能特性,下面是ThreadPoolExecutor的一個比較常用的構造方法。 ``` public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) ``` * **corePoolSize** **線程池的核心線程數,默認情況下,核心線程會在線程池中一直存活,即使它們處于閑置狀態**。*如果將ThreadPoolExecutor的[allowCoreThreadTimeOut](https://developer.android.google.cn/reference/kotlin/java/util/concurrent/ThreadPoolExecutor?hl=en#allowsCoreThreadTimeOut())屬性設置為true,那么閑置的核心線程在等待新任務到來時會有超時策略,這個時間間隔由keepAliveTime所指定,當等待時間超過keepAliveTime所指定的時長后,核心線程就會被終止*。 * **maximumPoolSize** **線程池所能容納的最大線程數,當活動線程數達到這個數值后,后續的新任務將會被阻塞**。 * **keepAliveTime** **非核心線程閑置時的超時時長,超過這個時長,非核心線程就會被回收**。當ThreadPool-Executor的**allowCoreThreadTimeOut屬性設置為true時,keepAliveTime同樣會作用于核心線程**。 * **unit** **用于指定keepAliveTime參數的時間單位**,這是一個枚舉,常用的有TimeUnit. MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)以及TimeUnit.MINUTES(分鐘)等。 * **workQueue** **線程池中的任務隊列,通過線程池的execute方法提交的Runnable對象會存儲在這個參數中**。 * **threadFactory** **線程工廠,為線程池提供創建新線程的功能**。 **ThreadFactory是一個接口,它只有一個方法**:`Thread newThread(Runnable r)`。 除了上面的這些主要參數外,ThreadPoolExecutor**還有一個不常用的參數RejectedExecutionHandler handler**。**當線程池無法執行新任務時,這可能是由于任務隊列已滿或者是無法成功執行任務,這個時候ThreadPoolExecutor會調用`RejectedExecutionHandle`r的rejectedExecution方法來通知調用者,默認情況下rejectedExecution方法會直接拋出一個RejectedExecutionException**。 ``` public interface RejectedExecutionHandler { void rejectedExecution(Runnable r, ThreadPoolExecutor executor); } private static final RejectedExecutionHandler defaultHandler =new AbortPolicy(); ``` :-: ![](https://img.kancloud.cn/29/45/29452a0b3876ef068d07e4aef1244341_473x114.png) RejectedExecutionHandler的樹結構 >[success]注意:從源碼和樹結構中可以看出,這個RejectedExecutionHandler是一個接口,但它并不是handler,只是名字里有handler,在ThreadPoolExecutor這個類里面,它有**CallerRunsPolicy**、**AbortPolicy**、**DiscardPolicy**和**DiscardOldestPolicy**四個實現類。 **ThreadPoolExecutor為`RejectedExecutionHandler`提供了幾個可選值**:**CallerRunsPolicy**、**AbortPolicy**、**DiscardPolicy**和**DiscardOldestPolicy**,其中**AbortPolicy是默認值(源碼中可以看出),它會直接拋出RejectedExecutionException**,由于`RejectedExecutionHandler`這個參數不常用,這里就不再具體介紹了。 ThreadPoolExecutor執行任務時大致遵循如下規則: * (1)**如果線程池中的線程數量未達到核心線程的數量,那么會直接啟動一個核心線程來執行任務**。 * (2)**如果線程池中的線程數量已經達到或者超過核心線程的數量,那么任務會被插入到任務隊列中排隊等待執行**。 * (3)**如果在步驟2中無法將任務插入到任務隊列中,這往往是由于任務隊列已滿,這個時候如果線程數量未達到線程池規定的最大值,那么會立刻啟動一個非核心線程來執行任務**。 * (4)**如果步驟3中線程數量已經達到線程池規定的最大值,那么就拒絕執行此任務,ThreadPoolExecutor會調用RejectedExecutionHandler的rejectedExecution方法來通知調用者**。 ThreadPoolExecutor的參數配置在AsyncTask中有明顯的體現,下面是**AsyncTask中的線程池的配置情況**: ``` private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); private static final int CORE_POOL_SIZE = CPU_COUNT + 1; private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1; private static final int KEEP_ALIVE = 1; private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); } }; private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128); /** * An {@link Executor} that can be used to execute tasks in parallel. */ public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); ``` 從上面的代碼可以知道,AsyncTask對`THREAD_POOL_EXECUTOR`這個線程池**進行了配置**,配置后的線程池規格如下: * · **核心線程數等于CPU核心數 + 1**; * · **線程池的最大線程數為CPU核心數的2倍 + 1**; * · **核心線程無超時機制,非核心線程在閑置時的超時時間為1秒**; * · **任務隊列的容量為128**。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看