2011-01-13 54 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> 
相关问题