有什麼方法可以將某種自定義元數據(任何對象)附加到java中的線程中?例如,如果我使用ThreadPoolExecutor運行幾個線程,並將一些線程連接到每個元數據,並將這些線程傳遞到某個能夠讀取此元數據的處理器中?將元數據附加到Java中的線程
據我所看到的線程的源代碼,我可以做的唯一事情 - 只需設置線程名稱。
感謝AlexR我已經解決了這個問題。那個記得啓動這個線程的線程的Id。
public class StarterThreadAwareThread extends Thread {
private volatile long startedThreadId;
public StarterThreadAwareThread(ThreadGroup group, Runnable target, String name) {
super(group, target, name);
}
public long getStartedThreadId() {
return startedThreadId;
}
@Override
public synchronized void start() {
this.startedThreadId = Thread.currentThread().getId();
super.start();
}
}
那麼一些魔術的ThreadFactory - 重寫新線程的創建
Thread newThread(Runnable r) {
return new StarterThreadAwareThread(getThreadGroup(), runnable, nextThreadName());
}
然後在每一個地方,我們可以靜態訪問提交者的線程ID喜歡
StarterThreadAwareThread thread = (StarterThreadAwareThread)Thread.currentThread(); // check with instaneof before casting if required
thread.getStartedThreadId();
PS :如果每次調用提交時ThreadPoolExecutor都創建新線程,則此解決方案有效。如果沒有,我已經創建更復雜的解決方案,但它應該時時處處工作: 1. http://pastebin.com/GU4S793Y 2. http://pastebin.com/f936R2rc 3. http://pastebin.com/YxuGXHiT
這是不完全清楚你試圖達到什麼目的。如果使用執行程序,爲什麼「線程」的元數據是相關的?你可以嘗試'ThreadLocal',或者從'Thread'映射到元數據,但是我發現很難想象一個用例。 –
我渴望的主要目標是能夠獲得已將任務歸入ThreadPoolExecutor的線程的If。 如果我手動創建線程,我可以使用父母線程ID。但是,如果ThreadPoolExecutor驅動線程創建和重用,我無法輕鬆獲取已完成任務的線程的標識。 對於考試人員,我有一個特殊的記錄器appender,它只能記錄特殊線程和所有子線程的蹤跡。由於由ThreadPoolExecutor啓動的線程不是子線程,因此很難做到。 –