【问题标题】:What does this code do (ever seen an object without a reference variable? how about invoking the object later without the reference variable?)?这段代码做了什么(见过没有引用变量的对象吗?以后在没有引用变量的情况下调用对象怎么样?)?
【发布时间】:2009-08-05 19:45:38
【问题描述】:
EventQueue.invokeLater(new Runnable()
  {
     public void run()
        {
           ZipTestFrame frame = new ZipTestFrame();
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.setVisible(true);
        }
  });

【问题讨论】:

    标签: java events object


    【解决方案1】:

    该代码创建了一个实现可运行的匿名类的实例。该对象作为参数传递给 EventQueue.invokeLater,后者稍后会调用它(意味着它将在稍后的某个时间点调用该对象的 run 方法)。

    您不需要变量来指向该对象,因为您只在该实例中使用该对象。方法 invokeLater 确实有一个指向对象的局部变量(假设对象作为参数传递并且参数是局部变量),它用于将对象存储在事件队列中,该队列现在也引用该对象,直到对象被调用并从队列中删除,此时它可以进行垃圾回收。

    附录:

    一个简单事件队列的原始示例:

    class MyEventQueue {
        Queue<Runnable> queue = new LinkedList<Runnable>();
        public void invokeLater(Runnable r) {
            queue.add(r);
        }
        public boolean hasNext() {
            return !queue.isEmpty();
        }
        public void processNext() {
            queue.poll.run();
        }
    }
    

    【讨论】:

    • 它被放入队列即EventQueue中,并在队列中前面的项目被处理后执行
    【解决方案2】:

    这是 Event 的样子:

    class Event { 
        Runnable RunnableObject; 
        public void invokeLater(Runnable runner) { 
            RunnableObject = runner; 
        }
        /* background thread */ 
        public void thread() { 
            while ( condition ) { 
                if ( itsLater ) { 
                   RunnableObject->run();
                }
            }
         }
     }
    

    在 Event 门面后面运行了一个异步方法,它将获取您传递给 invokeLater 的匿名对象并调用它的 run() 方法。该对象仍然存在,它有一个定义 - 但它没有可用于随后查询它的引用,除非您使用 run() 方法将 this 指针传递给其他对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 2013-05-20
      • 2011-04-22
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2011-09-04
      • 2011-05-06
      相关资源
      最近更新 更多