EventQueue的ID不一致

Tovi7:

我对以下示例代码有问题,该示例代码显示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将匹配。

我的另一个问题是:如何解决这个问题?我正在使用只能在创建线程上访问的对象。如果这恰好是事件队列(不一定必须是),我必须能够检查它是否仍然是事件队列。

约阿希姆·绍尔(Joachim Sauer):

不再需要该AWT事件调度线程时,可以将其关闭(此页面同时描述了JDK 7中的实现和实际实现的行为)。

这似乎发生在这里:您使用系统EventQueue来处理一个事件。然后,就不再需要它了(不需要AWT / Swing组件,...)。一段时间后,它将关闭。

然后,当您EventQueue再次使用该线程,另一个线程将开始担任该角色。

因此,这里发生的是您的Runnable.run()方法确实两个不同的线程上执行这两个线程都是“ AWT事件调度线程”,只是在JVM生命周期的不同时间。

也许使用这种特殊的套管EventQueue.isDispatchThread()是一种可能的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章