2015-06-17 41 views
-1

有很多人在項目上工作,我想確保每個人都給他們的線程賦予邏輯名稱,以便它們易於調試和讀取日誌。如何確保沒有自定義名稱的情況下不創建線程?

我試過了,但是由於後來我意識到的一個非常根本的原因,它失敗了。我將這段代碼放在這裏,以便它使我的目的更加清晰。

public abstract class MyRunnableAbstract implements Runnable 
{ 
    public MyRunnableAbstract (String pThreadName) 
    { 
     Thread.currentThread().setName(pThreadName); 

    } 
} 

在這裏,每個想要創建線程的人都必須擴展這個類,而不是直接實現Runnable。這樣,您必須將名稱傳遞給超級構造函數而不會失敗。

由於構造函數是作爲父線程的一部分執行的,因此currentThread()設置父線程的名稱,而不是正在創建的父線程的名稱。

但我想做類似的事情,沒有人能夠不通過名稱就能創建線程。

有沒有辦法?

在此先感謝。

+3

是什麼讓你認爲開發人員會尊重擴展該類的規則而不是實現Runnable?這很容易違反,因爲忘了給一個名字來創建一個線程。坦率地說,一個好的應用程序應該很少創建線程。大多數情況下,使用更高級別的抽象(ExecutorService)是正確的解決方案。 –

+0

有一種方法,它被稱爲「代碼審查」。 - 沒有人檢查到源代碼存儲庫的任何更改,直到更改由另一個團隊成員審查。而且,如果有人拒絕按規則參加比賽,那麼你將他們踢出球隊。 –

回答

3

既然你想改變線程的行爲,那麼顯而易見的事情就是擴展線程。擴展類只應公開帶有名稱參數的構造函數。

當然,您還需要一個禁止直接使用Thread的編程約定。

+0

實際擴展線程的幾個原因之一!儘管直接使用線程仍然幾乎在所有情況下都是錯誤的,所以.. – Voo

+1

更好的是:如果要擴展線程,那麼您可能應該傳遞一個ThreadFactory。 (請參閱下面的@hagrawal的回覆)。 –

0

不可能阻止用戶嚴重編程。例如,您可以擴展Thread如下:

public class NamedThread extends Thread { 
    public NamedThread(String name) { 
     super(); 
     setName(name); 
    } 
} 

然後,你要告訴你的工作團隊,誰不使用新NamedThread人的認可......比如......他們必須提供比薩餅到全團每次使用的NamedThread :-D

正常Thread代替如果一個月後,全團已獲得10公斤......時間可能是你的組不能正常工作下你的方向:-D

2

ThreadFactory是你的朋友,我的朋友。它的目的就是爲了創建應用程序的所有自定義線程的中心位置;工廠設計模式的一個例子。看下面的代碼:

public class SimpleThreadFactory implements ThreadFactory { 
    public Thread newThread(Runnable r) { 
     return new Thread(r); 
    } 

    public Thread createCustomThreadWithName(Runnable r, String threadName) throws Exception { 
     if(threadName == null || threadName.isEmpty()){ 
      throw new Exception("Please provide a thread name"); 
     } 
     Thread thread = newThread(r); 
     thread.setName(threadName); 
     return thread; 
    } 

} 
+0

做了一些答案幫助? – hagrawal

相關問題