samples/openfixed/src/org/apidesign/openfixed/AsyncEventSupport.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sun, 20 Mar 2011 18:52:47 +0100
changeset 374 35da2d439e3d
child 375 3abae898011d
permissions -rw-r--r--
Calculator and various ways to deliver changes in its counter to listeners
     1 package org.apidesign.openfixed;
     2 
     3 import java.util.List;
     4 import java.util.concurrent.CopyOnWriteArrayList;
     5 import java.util.concurrent.Executor;
     6 import java.util.concurrent.Executors;
     7 
     8 /**
     9  *
    10  * @author Jaroslav Tulach <jtulach@netbeans.org>
    11  */
    12 final class AsyncEventSupport implements EventSupport {
    13     private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
    14     private static final Executor EXEC = Executors.newSingleThreadExecutor();
    15     
    16     AsyncEventSupport() {
    17     }
    18 
    19     @Override
    20     public void fireModificationEvent(ModificationEvent ev) {
    21         EXEC.execute(new Deliverable(ev, listeners.toArray(new ModificationListener[0])));
    22     }
    23 
    24     @Override
    25     public void add(ModificationListener l) {
    26         listeners.add(l);
    27     }
    28 
    29     @Override
    30     public void remove(ModificationListener l) {
    31         listeners.remove(l);
    32     }
    33     
    34     private static class Deliverable implements Runnable {
    35         final ModificationEvent ev;
    36         final ModificationListener[] listeners;
    37 
    38         public Deliverable(ModificationEvent ev, ModificationListener[] listeners) {
    39             this.ev = ev;
    40             this.listeners = listeners;
    41         }
    42 
    43         @Override
    44         public void run() {
    45             for (ModificationListener l : listeners) {
    46                 l.modification(ev);
    47             }
    48         }
    49     }
    50 }