2011-01-13 88 views
13

我有一個圍繞線程的一系列規則的多線程Java程序:例如,類A中的代碼只能從UI線程調用;在B類3種方法只能從網絡線程調用等你如何檢查哪個線程正在Java中執行代碼?

如何做的斷言或其他代碼檢查任何建議,這些規則得到遵守?我想做相當於「不變量」的測試,以防止線程使用中的編碼錯誤。 。

回答

12

除了adamfisk的很好的建議,也有一個方便的方法具體測試當前線程是否爲EDT線程:

EventQueue.isDispatchThread() 
+1

+1 - 在編寫Swing時,UI /非UI問題通常是唯一重要的問題。 – kdgregory 2011-01-13 19:39:14

+1

謝謝,我沒有使用鞦韆,但我想很多人閱讀這將是。 – Nils 2011-01-14 05:58:41

16

Thread.currentThread()的getName()

+0

+1關懷圓了你的答案與RD01的答案擺動殼? – Nils 2011-01-14 06:08:11

1

我會做這樣的在我的代碼A類:

if(!"UI thread".equals(Thread.currentThread().getName())){ 
    throw new IllegalStateException("wrong thread running this class, thread name:"+Thread.currentThread().getName()); 
} 
2

考慮顛倒這個問題。考慮預防而不是強制執行。

如果類Mangalor只能在UI線程中運行,請將Mangalor類的可見性限制爲UI類。 如果CanOnString類的talk()和listen()方法只能在聯網線程中運行,請將這些方法的可見性限制爲您在聯網線程中運行的類。

7

您可以嘗試

assert Thread.currentThread() == expectedThread; 

問題與使用的名稱是任意數量的線程可以例如使用該名稱如果你特別偏執,你可能會擔心這樣的代碼。

Thread.t = Thread.currentThread(); 
String name = t.getName(); 
t.setName("UI thread"); 
callUIThreadOnlyMethod(); 
t.setName(name); 
0

您還可以使用日誌記錄來檢查線程名稱,例如, log4j的或的logback,只需設置包括%thread這樣的模式:

<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 
    <root level="INFO"> 
    <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 
相關問題