2009-08-05 1 views
0
EventQueue.invokeLater(new Runnable() 
    { 
    public void run() 
     { 
      ZipTestFrame frame = new ZipTestFrame(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
     } 
    }); 

ответ

9

Этот код создает экземпляр запускаемого анонимного класса runnable. Этот объект передается как аргумент EventQueue.invokeLater, который будет вызывать его позже (это означает, что он вызовет метод выполнения этого объекта в некоторый более поздний момент времени).

Вам не нужна переменная, указывающая на объект, потому что вы используете этот объект только в этом экземпляре. Метод 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(); 
    } 
} 
+0

как он будет вызывать его позже? –

+1

Он помещается в очередь i.e. EventQueue и запускается после того, как обрабатываются элементы, находящиеся впереди в очереди. – user101884

0

Вот что выглядит событие, как:

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

Существует асинхронный метод отстайма фасад события, который примет анонимный объект, который вы передали invokeLater, и вызовите его метод run(). Объект все еще существует, он имеет определение - но у него нет ссылки, которую вы можете использовать для последующего опроса, если вы не используете метод run() для передачи этого указателя на что-то еще.

Смежные вопросы