1. 程式人生 > >什麼時候手動建立執行緒而不使用執行緒池

什麼時候手動建立執行緒而不使用執行緒池

1、需要自定義執行緒的優先順序,執行緒池中執行緒總是Normal

2、需要一個前臺執行緒,執行緒池中執行緒是後臺執行緒

     非UI執行緒最好使用執行緒池建立為後臺執行緒,常常關閉一個軟體之後,仍然佔有記憶體,就是由於建立了多個前臺執行緒,程式關閉的時候,還有其他前臺執行緒沒有關閉。

3、需要手動終止執行緒,執行緒池不具有這種功能。

4、執行緒執行時間長,執行緒池目的是為了執行緒重用,省去建立新執行緒的額外開銷,多適用於多而執行時間短的執行緒。執行緒池建立執行緒是滯後的,不會發現執行緒不夠立即去建立新執行緒,會有個延時,以確保真正的需要建立新執行緒。

Executors建立執行緒池的弊端

執行緒池不允許使用Executors去建立,而是通過ThreadPoolExecutor的方式,

這樣的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險.
說明:Executors的各個方法的弊端:
1)newFixedThreadPool和newSingleThreadExecutor:
主要問題是堆積的請求處理佇列可能會耗費非常大的記憶體,甚至OOM.
2)newCachedThreadPool和newScheduledThreadPool:

主要問題是執行緒數最多數是Integer.MAX_VALUE,可能會建立數量非常多的執行緒,甚至OOM.

Positive example 1:

  1. //org.apache.commons.lang3.concurrent.BasicThreadFactory;
  2.  ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(  
  3.                 1,  
  4.                 new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build()  
  5.         );  
Positive example 2:
  1. ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat(
    "demo-pool-%d").build();  
  2.        //Common Thread Pool
  3.        ExecutorService pool = new ThreadPoolExecutor(5,200,0L,TimeUnit.MILLISECONDS,  
  4.        new LinkedBlockingDeque<Runnable>(1024),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());  
  5.        pool.execute(()-> System.out.println(Thread.currentThread().getName()));  
  6.        pool.shutdown();//gracefully shutdown
Positive example 3:
  1.     <bean id="userThreadPool"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
  2.         <property name="corePoolSize" value="10"/>  
  3.         <property name="maxPoolSize" value="100"/>  
  4.         <property name="queueCapacity" value="2000"/>  
  5.         <property name="threadFactory" value="threadFactory"/>  
  6.         <property name="rejectedExecutionHandler">  
  7.             <ref local="rejectedExecutionHandler"/>  
  8.         </property>  
  9.     </bean>  
  10. // in code 
  11. userThreadPool.execute(thread);  

相關推薦

什麼時候手動建立執行使用執行

1、需要自定義執行緒的優先順序,執行緒池中執行緒總是Normal2、需要一個前臺執行緒,執行緒池中執行緒是後臺執行緒     非UI執行緒最好使用執行緒池建立為後臺執行緒,常常關閉一個軟體之後,仍然佔有記憶體,就是由於建立了多個前臺執行緒,程式關閉的時候,還有其他前臺執行緒沒

為什麼在Service中建立執行是Activity中

    這是因為Activity很難對Thread進行控制,當Activity被銷燬之後,就沒有任何其它的辦法可以再重新獲取到之前建立的子執行緒的例項。而且在一個Activity中建立的子執行緒,另一

Nginx 一個伺服器多域名配置 以及 訪問php檔案直接下載執行

1.環境,為了方便直接使用lnmp 一鍵安裝包安裝成 http://lnmp.org/install.html 安裝完成後Nginx 配置在 /usr/local/nginx/conf/nginx.conf  在 /usr/local/nginx/conf 資料夾下 有一個

跳出內層for迴圈,執行外層for迴圈剩餘語句

在專案中遇到需要跳出內層for迴圈的同時,不執行外層for迴圈剩餘語句,直接開始執行下一次外層for迴圈的問題。 我個人並不想使用變數來判斷是否continue,最後發現可以通過為for迴圈命名,然後continue至特定的for迴圈來解決這個問題。 於是寫個下面的例子記錄

nginx/php-fpm 訪問php檔案直接下載執行

遇到這種問題,首先確認你web伺服器配置中的.php是不是被指定給FastCGI server處理:location ~ .php$ {fastcgi_pass 127.0.0.1:9000;}如已配置,那麼可能是由於fastcgi_script_name訪問指令碼路徑不正確

修改檔案之後執行make是make clean

這個問題很bug。在做專案的時候,我只是簡單的修改了檔案,如刪除多餘的空行,讓程式碼對齊等等,然後重新執行make,這時候會出現詭異的段錯誤,使用gdb定位出現段錯誤的地方,絞盡腦汁都沒弄懂為什麼會發生

selenium-python編寫unittest執行程式碼時候執行

使用python+ selenium 編寫簡單的自動化指令碼的時候,自己寫出簡單的程式碼如下: import unittest from selenium import webdriver import time class LoginCase(unittest.TestCase): de

ajax()執行success也執行error的分析和解決

呼叫後臺新增功能,data能夠正常傳入後臺,資料庫成功更新,但是ajax()既不進入success,也不進入error。 檢查ajax中datatype與後臺返回值資料型別。 //ajax資料 $.ajax({ type:"POST",

ajax提交請求執行成功後執行success,而是執行error

js方法: //儲存 function save() { $.ajax({ type:'POST', url:'<%=basePath%>user/addUser', data:$('#form1').serialize(), dataType: 'json'

關於IHK鉤子引擎跳過API(只執行鉤子,執行API)的實現方式

只要getretAddr之後,跳到那個地址即可,也就是說設定一個介面directlyReturnAddr(addr:pointer

如何實現多執行?實現多執行為什麼要調start,是run方法?(繼承Thread類、實現Ruable介面、Callable<V>)

什麼是程序? 作業系統中一個程式的執行週期(從開啟到關閉)。程序是具有一個或多個執行緒的執行緒組。 什麼是執行緒? 一個程序可以同時執行多個任務,任務就是執行緒,一個程序至少有一個執行緒。 執行緒執行在程序內部,執行緒是輕量級程序。 程序和執行緒比較:

執行建立和使用,建議直接使用Executor建立

實現執行緒池,有四種策略: 生成執行緒池採用了工具類Executors的靜態方法,以下是四種常見的執行緒池。 SingleThreadExecutor:單個後臺執行緒 (其緩衝佇列是無界的)。 建立一個單執行緒的執行緒池。這個執行緒池只有一個核心執行緒在工作,也就是相當於單執行緒序列執行

java多執行3:關鍵字synchronized取得的鎖都是物件鎖,是把一段程式碼或者方法(函式)當作鎖

java多執行緒3:關鍵字synchronized取得的鎖都是物件鎖,而不是把一段程式碼或者方法(函式)當作鎖 a.當多個執行緒訪問同一個物件的時候,哪個執行緒先執行帶synchronized關鍵字的方法,哪個執行緒就該方法所屬物件的鎖Lock,那麼其他物件就智慧呈等待狀態。但是如果多個執行緒訪

Java  手動建立執行

oracle提供了一個通過ThreadPoolExecutor建立一個執行緒池的類 構造器 使用給定的引數和預設的飽和策略、預設的工廠方法建立執行緒池 ThreadPoolExecutor(int corePoolSize, int maximu

如何實現多執行?實現多執行為什麼要調start,是run方法?(繼承Thread類、實現Ruable介面、Callable)

什麼是程序? 作業系統中一個程式的執行週期(從開啟到關閉)。程序是具有一個或多個執行緒的執行緒組。 什麼是執行緒? 一個程序可以同時執行多個任務,任務就是執行緒,一個程序至少有一個執行緒。 執行緒執行在程序內部,執行緒是輕量級程序。 程序和執行緒比較: 與

執行是否要手動建立autoreleasepool

NSThread和NSOperationQueue開闢子執行緒需要手動建立autoreleasepool,GCD開闢子執行緒不需要手動建立autoreleasepool,因為GCD的每個佇列都會自行建立autorele

Python中為什麼更推薦多程序是多執行

原文連結 最近在看Python的多執行緒,經常我們會聽到老手說:“Python下多執行緒是雞肋,推薦使用多程序!”,但是為什麼這麼說呢?                  要知其然,更要知其所以然。所以有了下面的深入研究:                  首先強調背景:

執行建立執行問題

#include<stdio.h>#include<pthread.h>int i = 0;static void* print_message_function( void *ptr );int main(int argc ,char** argv ){        pthread

C語言之多執行機制(程式可以同時被執行會相互干擾)

接觸過linux的人或多或少知道,linux有多執行緒的機制,也就是說程式可以同時執行,不受干擾,關於這個在我以前的博文裡有過類似模擬的時間片輪轉程式,跟這個其實是類似的。其實在window上,執行緒的標頭檔案也是可以包含進來使用的,我這裡用DevC++這個軟體來測試,看看

我會手動建立執行,為什麼讓我使用執行

| 好看請贊,養成習慣 你有一個思想,我有一個思想,我們交換後,一個人就有兩個思想 If you can NOT explain it simply, you do NOT understand it well enough 現陸續將Demo程式碼和技術文章整理在一起 Github實踐精選 ,