我对以下显示 EventQueue 行为不一致的示例代码有疑问:
public static void main( String[] args ) throws InvocationTargetException, InterruptedException {
final long[] id1 = new long[ 1 ];
final long[] id2 = new long[ 1 ];
EventQueue.invokeAndWait( new Runnable() {
@Override public void run() {
id1[ 0 ] = Thread.currentThread().getId();
}
} );
Thread.sleep( 5000 );
EventQueue.invokeAndWait( new Runnable() {
@Override public void run() {
id2[ 0 ] = Thread.currentThread().getId();
}
} );
System.out.println( "id1 = " + id1[0] );
System.out.println( "id2 = " + id2[0] );
if(id1[0]!=id2[0]){
System.out.println("These ID's don't match, even though they were retrieved from the same thread.");
}
}
基本上,它获取事件队列线程的 ID,等待 5 秒然后再次获取 ID。
由于某种原因,ID 不匹配。显然,EventQueue 被销毁并重新创建。这是正常行为吗?这是在某处记录的吗?它是一个错误吗?即使是不同的实例,它不应该具有相同的ID吗?
如果我不执行Thread.sleep
,则 ID 将匹配。
我的另一个问题是:我怎样才能解决这个问题?我正在使用一个只能在创建线程上访问的对象。如果这恰好是事件队列(不一定是),我必须能够检查它是否仍然是事件队列。