2012-11-14 33 views
0

我有一個實現Runnable的類。由於記錄的原因,我想知道已經用來運行類的線程。在這種情況下會是最好做本地線程變量或新線程 - Java

public class WebSocketHandle implements Runnable { 
    private Thread myThread; // access to thread for logging 

    public void start() { 
     myThread = new Thread(this); 
     myThread.start(); 
    } 
} 

然後在創建該方法,這些我做這樣的事情:

public void newSocket(Socket socket) 
{ 
    WebSocketHandle handle = new WebSocketHandle(this, socket,_identity); 
    _sockets.add(handle); 

    EventLog.write("Socket assigned for new connection (" + _sockets.size() + ") " + handle.toString() + ". No value received yet yet...", getClass().getName(), "register"); 

    // Start thread listening for data 
    new Thread(handle).start(); 
} 

或者是它最好有類似:

public class WebSocketHandle implements Runnable { 
    private String myThread; 

    public void setThreadOwner(string threadId) { 
     myThread = threadId; 
    } 
} 

然後它可以這樣使用:

WebSocketHandle handle = new WebSocketHandle(); 
Thread newThread = new Thread(handle); 

newThread.start(); 

handle.setThreadOwner(handle.toString()); 

我不禁感到第二個選擇是更好的做法,但編寫的代碼似乎很笨拙?

編輯:在回答亞倫的評論:

  1. 這是一個Web服務器套接字處理代碼,以便該線程將被indefinetly運行。我沒有考慮使用ThreadPools,所以也許這是我需要考慮的事情

  2. 我記錄了WebSocketHandle類中的各種活動(即數據接收和發送),所以我想將日誌事件綁定到Thread實例正在運行。爲此,我發現最簡單的方法是將thread.toString()作爲日誌輸出的一部分記錄下來。

回答

4

你可以簡單地調用Thread.currentThread()來獲取正在執行代碼的線程。

爲了幫助識別一個線程,使用new Thread("some useful name");

[編輯]您的兩個方法有一些缺點。第一種方法總是創建一個線程,所以你不能在線程池中執行runnable。最終,你會想要這樣做。不幸的是,當你發現你做的時候,你的應用程序將變得非常複雜,而且很難改變。

此外,「線程」並沒有多大幫助;它通常不知道哪個線程開始了某些事情。在尋找錯誤時,你想知道哪一段代碼執行了一個方法。所以將Logger傳入start()會更有意義。

這就是說,「訪問線程進行日誌記錄」是什麼意思?在start()中創建的匿名線程包含哪些信息可能對日誌記錄有用?由於它有一個生成的名稱,你仍然不知道誰叫start(),所以第一種方法對我來說看起來完全沒用。

第二種方法允許您給Runnable一個名字,但a)它不能編譯,b)也沒有任何意義(不提及變量名稱令人困惑的事實)。

要獲得某種東西,您可以撥打getClass().getName();使用setter來設置實例的類名沒有意義。所以第二種方法是危險的混淆,它違反了DRY principle

而且,它不會給你很多有用的信息進行記錄:它不會告訴你是誰創造的MyClass實例,如果你想要一個記錄器爲MyClass,你可以簡單地使用這一行:

private Logger log = LoggerFactory.getLogger(getClass()); 

有沒有必要設置。

所以我的結論是應該避免這兩種方法。

+0

乾杯亞倫。爲什麼第二種方法更好會有特別的原因嗎? – dreza

+0

我添加了更長的代碼分析。 –

+0

乾杯亞倫。現在更有意義。我沒有考慮過使用ThreadPools,所以也許這是我需要考慮的事情 – dreza