2014-03-26 19 views
0

有什麼方法可以將某種自定義元數據(任何對象)附加到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

+0

這是不完全清楚你試圖達到什麼目的。如果使用執行程序,爲什麼「線程」的元數據是相關的?你可以嘗試'ThreadLocal',或者從'Thread'映射到元數據,但是我發現很難想象一個用例。 –

+0

我渴望的主要目標是能夠獲得已將任務歸入ThreadPoolExecutor的線程的If。 如果我手動創建線程,我可以使用父母線程ID。但是,如果ThreadPoolExecutor驅動線程創建和重用,我無法輕鬆獲取已完成任務的線程的標識。 對於考試人員,我有一個特殊的記錄器appender,它只能記錄特殊線程和所有子線程的蹤跡。由於由ThreadPoolExecutor啓動的線程不是子線程,因此很難做到。 –

回答

0

我認爲在你的情況下實現這個最簡單的方法是使用自定義線程工廠和你自己的線程實現。

創建MetadataAwareThread

public class MetadataAwareThread extends Thread { 
    MetadataAwareThread(Runnable runnable, Map<String, String> metadata) {} 
} 

現在創建您的自定義線程工廠:

public class MetadataAwareThreadFactory implements ThreadFactory { 
    public Thread newThread(Runnable r) { 
    return new MetadataAwareThread(r, new HashMap<String, String>()); 
    } 
} 

現在你可以使用這個工廠如下:

Exectors.newCachedThreadPool(new MetadataAwareThreadFactory())

0

附上元到Runnable代替。它不是Threads你運行,Threads運行Runnables(好吧,ThreadsRunnables,但他們調用Runnablerun()方法)。

0

您可以使實現Runnable接口的類的構造函數具有一些參數(或使用setter)。然後,您可以使用instanceof來查看該對象是否是您知道包含元數據的類。