Le 24/08/2010 10:57, [email protected] a écrit :
Changeset: 7e26538596be
Author:    art
Date:      2010-08-24 12:54 +0400
URL:       http://hg.openjdk.java.net/jdk7/awt/jdk/rev/7e26538596be

6949936: Provide API for running nested events loops, similar to what modal 
dialogs do
Reviewed-by: ant, anthony

! src/share/classes/java/awt/Dialog.java
! src/share/classes/java/awt/EventDispatchThread.java
! src/share/classes/java/awt/EventQueue.java
+ src/share/classes/java/awt/SecondaryLoop.java
+ src/share/classes/java/awt/WaitDispatchSupport.java
+ test/java/awt/EventQueue/SecondaryLoopTest/SecondaryLoopTest.java


Hi all, nice to see that this kind of API find its way to jdk7.

The example provided in SecondaryLoop don't compile.
Here is a slightly modified version that compile.

        JButton jButton = new JButton("Button");
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                EventQueue queue = Toolkit.getDefaultToolkit()
                        .getSystemEventQueue();
                final SecondaryLoop loop = queue.createSecondaryLoop();

                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        // Perform calculations
                        doSomethingUseful();

                        // Exit the loop
                        loop.exit();
                    }
                };

                // Spawn a new thread to do the work
                Thread worker = new Thread(runnable);
                worker.start();

                // Enter the loop to block the current event
                // handler, but leave UI responsive
                if (!loop.enter()) {
                    // Report an error
                }
            }
        });

About the API design, SecondaryLoop.enter is not reentrant so it's
an error to call it recursively. So enter() should throw a runtime exception
instead of returning false. I propose to use IllegalStateException.

SecondaryLoop is in my opinion a bad name, a for or a while is a loop,
in my opinion, SecondaryEventLoop is a better name.

Also, you don't provide a way to transfer any value from the computation
done in the thread back to the event queue thread like by example
the SwingWorker does.

I propose to change SecondaryEventLoop to:

public interface SecondaryEventLoop<V> {
  public V enter();
  public boolean exit(V value);
}

exit() can send a value that will be returned when enter() will end.

I also wonder if the return value of exit is useful.
exit can be called before enter() due to a race between enter() and exit(),
why a developer should care about that.

cheers,
Rémi

Reply via email to