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

Répondre

9

Ce code crée une instance d'une classe anonyme implémentant runnable. Cet objet est passé en argument à EventQueue.invokeLater, qui l'appellera plus tard (ce qui signifie qu'il appellera la méthode run sur cet objet à un moment ultérieur).

Vous n'avez pas besoin d'une variable pour pointer vers l'objet car vous utilisez uniquement cet objet dans cette instance. La méthode invokeLater possède une variable locale pointant vers l'objet (étant donné que l'objet est passé en argument et les arguments sont des variables locales), qu'il utilise pour stocker l'objet dans la file d'attente des événements, qui fait également référence à l'objet jusqu'à L'objet est appelé et retiré de la file d'attente, auquel cas il est éligible pour la récupération de place.

Addendum:

Un exemple primitif de ce qu'est une file d'attente d'événement simple pourrait ressembler à:

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

comment l'invoquera-t-il plus tard? –

+1

Il est placé dans une file d'attente, c'est-à-dire EventQueue, et est exécuté après le traitement des éléments qui le précèdent dans la file d'attente. – user101884

0

est ici ce qui ressemble événement comme:

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

Il existe une méthode asynchrone en retard la façade Event qui prendra l'objet anonyme que vous avez passé à invokeLater et appellera sa méthode run(). L'objet existe toujours, il a une définition - mais il n'a pas de référence que vous pouvez utiliser pour l'interroger par la suite, sauf si vous utilisez la méthode run() pour passer le pointeur this à quelque chose d'autre.

Questions connexes