1. 程式人生 > >ThreadPoolExecutor中執行執行緒名稱的修改

ThreadPoolExecutor中執行執行緒名稱的修改

專案中使用到了ThreadPoolExecutor,這個是挺好的東西,執行緒池的實現。但有一點不太爽的是,用Jprofiler除錯由它建立的執行緒的時候,看到的都是pool-1-thread-1\2\3\4之類的。這是它自身的預設規則產生的,pool代表這是池,-1-代表是第幾個ThreadPoolExecutor產生的,-thread-1是遞增的。

所以每次我都要點 Thread Dumps 去檢視執行緒執行的具體的程式碼與堆疊資訊,推測是哪個地方出的問題。雖然說也能看出來,但很不直觀嘛。於是有了一個想法,能不能不要用它的預設名稱,由我自己的設定執行緒的名字,這樣就一目瞭然了。把idea和master王說了,覺得也是個好主意。當然就只是在開發階段有幫助,系統穩定上線後就沒有用了。

 Executors.defaultThreadFactory()是預設的建立執行緒的實現。看下原始碼,

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
之所以在工具中看到所有的執行緒都是以 pool- 開頭的,那是因為人家就是寫死的。
    static class DefaultThreadFactory implements ThreadFactory {
        private static final AtomicInteger poolNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        DefaultThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                                  Thread.currentThread().getThreadGroup();
            namePrefix = "pool-" +
                          poolNumber.getAndIncrement() +
                         "-thread-";
        }

        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r,
                                  namePrefix + threadNumber.getAndIncrement(),
                                  0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }
我想要改成的格式是 pool-prjname-具體thread-1這種形式,如果說專案中所有程式碼共用一個pool,我可以直接把 poolNumber.getAndIncrement() 換成想要的名稱。沒錯。但是具體thread呢?再搞一個引數,從上層傳遞進來替換嗎?最開始發現貌似可以的。當然了,這意味著原生的Executors不能用了,把所有程式碼都copy到一個新類裡,可能還會關聯到其他類,也一併copy,如果不是關聯到很多類的話,還是可以的。如果一層又一層,就比較沒意思了。

使用方式:pool.taskPressIn(msgThread, "傳送tmp"); 傳送tmp就是我想要的具體thread的名稱。但通過工具多次觀察後,發現thread名稱不是傳進去的那個。認真考慮了newCachedThreadPool這個池,它是執行緒可複用的。當我提交了一個帶名稱的任務例項後,池子裡其實是有空閒的執行緒的,這些執行緒可能就是之前命過名的,直接執行例項了,名稱也就不會變了。

我最開始想著從池子中使用的執行緒入手,用的哪個就改哪個的名稱,由於跟程式碼,想發現任務execute時,怎麼獲取執行緒的,master王想了一個辦法。

我們說一個執行緒在start後才會執行run方法,run方法的執行表示這個task真正被執行緒運行了,這時執行緒的名稱也就確定了。所以可以在run的第一句加上       

Thread.currentThread().setName(ThreadPoolFairEx.renameThread(Thread.currentThread(), this.threadName));
Thread.currentThread()把當前的執行的執行緒傳進去,renameThread()是一個替換string的方法而已,把自定義的threadName替之。然後currentThread再setName。這樣就是這種效果


相關推薦

ThreadPoolExecutor執行執行名稱修改

專案中使用到了ThreadPoolExecutor,這個是挺好的東西,執行緒池的實現。但有一點不太爽的是,用Jprofiler除錯由它建立的執行緒的時候,看到的都是pool-1-thread-1\2\3\4之類的。這是它自身的預設規則產生的,pool代表這是池,-1-代表是

修改執行名稱,並在VC偵錯程式顯示

#define MS_VC_EXCEPTION 0x406d1388typedef struct tagTHREADNAME_INFO{ DWORD dwType; // must be 0x1000 LPCSTR szName; // pointer to na

Java執行池及其實現類ThreadPoolExecutor

前言:像我們連線資料庫一樣,需要不斷地建立連線,銷燬連線,如果都是人為地一個個建立和銷燬的話會很費勁,所以就誕生了資料庫連線池,執行緒池的產生也是同樣的道理。 執行緒池預先建立了若干數量的執行緒,並且不能由使用者直接對執行緒的建立進行控制,在這個前提下重複使用固定或較為固定數目的執行緒來完成任務

java獲得當前執行執行名稱

package 執行緒生命週期; public class 獲得主執行緒 { public static void main(String[] args) { // TODO Auto-ge

Java執行池——ThreadPoolExecutor的原理

private boolean addWorker(Runnable firstTask, boolean core) { retry: //死迴圈更新狀態 for (;;) { int c = ctl.get(); int

JDK1.5執行池(java.util.concurrent.ThreadPoolExecutor)使用簡介

在多執行緒大師Doug Lea的貢獻下,在JDK1.5中加入了許多對併發特性的支援,例如:執行緒池。 一、簡介執行緒池類為 java.util.concurrent.ThreadPoolExecutor,常用構造方法為:ThreadPoolExecutor(int corePoolSize, int ma

Spring配置執行ThreadPoolExecutor參考

<bean id="executorService" class="java.util.concurrent.ThreadPoolExecutor"> <constructor-

top、ps命令檢視程序執行方法

方法一:PS ps -a顯示所有程序pid,“-T”選項可以開啟執行緒檢視。 eg: ps -aT 顯示所有執行緒 方法二: Top top用於實時檢視各個執行緒情況,用top命令的“-H”選項,該選項會列出所有Linux執行緒。 eg1. top -H 所有執行緒 eg2.

執行執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

Spring 執行安全性

Spring與執行緒安全   Spring作為一個IOC/DI容器,幫助我們管理了許許多多的“bean”。但其實,Spring並沒有保證這些物件的執行緒安全,需要由開發者自己編寫解決執行緒安全問題的程式碼。   Spring對每個bean提供了一個s

Qt實現執行安全的單例模式

之前專案中用到單例模式,用的是執行緒不安全的,這次專案用到了多執行緒,所以想到實現一個執行緒安全的單例模式。經過查詢資料,發現Qt本身有自己的執行緒安全單例模式實現方式。 Q_GLOBAL_STATIC巨集 使用方法:MonitorWindow.h #ifndef MONITORW

將mysql資料庫的建表語句修改成green plum資料庫執行的指令碼

#用來獲取輸入的對應的表名稱的建表語句 #首先輸入需要獲取的mysql或者sql server的資料庫表名稱,到對應的資料庫中抓出建表語句, #然後,將建表語句進行對應的修改,形成可以在pg中可用的語句 #連線mysql資料 import pymysql import sys impor

觀察者模式執行執行訂閱事件並順序執行的問題

       對事件釋出訂閱模式中啟動執行緒執行操作,但又要保證執行緒順序執行的一些思考和實踐,在開發過程中,經常會遇到需要使用事件來觸發方法執行的情況,比如CS中按鈕的點選事件,滑鼠移動事件,鍵盤監聽事件等等,有時候需要執行比較耗時的任務,但並不希望阻塞主執

Java語言執行安全

執行緒安全定義:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要考慮進行額外的同步,或者在呼叫方進行任何其他的寫作操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件時執行緒安全的。 將Java語言中的各種操作共享的資料分為以下五類: 不可

MFC開啟執行

MFC標頭檔案中編寫:分檔案類外定義的資料   public: //執行緒 BOOL m_bThread; 再MFC的初始化中,編寫如下程式碼 //_建立執行緒 AfxBeginThread(ThreadProc,(LPVOID)this); m_bThread=

Java停止執行

一.停止執行緒會帶來什麼? 對於單執行緒中,停止單執行緒就是直接使用關鍵字return或者break,但是在停止多執行緒時是讓執行緒在完成任務前去開啟另外一條執行緒,必須放棄當前任務,而這個過程是不可預測,所以必須去做好防備。 二.認識停止執行緒的幾個方法  2.1三個被棄用的

UncaughtExceptionHandler處理執行執行時異常

執行緒在執行單元中不允許丟擲checked異常,而且執行緒執行在自己的上下文中,派生它的執行緒無法直接獲得它執行中出現的異常資訊。對此,Java為我們提供了UncaughtExceptionHandler介面,當執行緒在執行過程中出現異常時,會回撥UncaughtExceptionHan

Spring4.x執行使用

直接上程式碼: 一:配置類 import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springfram

powerbuilder 使用執行的方法

//宣告物件變數  ccuo_thread lccuo_thread  //建立新執行緒  SharedObjectRegister ('ccuo_thread' ,'thread_center' )  //引用例項  SharedObje

Android執行執行

執行緒與執行緒池 概括 執行緒分為主執行緒和子執行緒. 主執行緒主要是用來處理和介面相關的事情, 子執行緒主要是用來做耗時的操作,比如 載入遠端資料,資料庫操作等。 在android 中,處理直接使用 Thread以外。 android 還提供了很多類似執行緒的操作便於我們