samples/openfixed/src/org/apidesign/openfixed/AsyncEventSupport.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 03 Apr 2020 16:32:36 +0200
changeset 416 9ed8788a1a4e
parent 375 3abae898011d
permissions -rw-r--r--
Using HTTPS to download the libraries
     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 import org.apidesign.openfixed.Calculator.EventSupport;
     8 
     9 /**
    10  *
    11  * @author Jaroslav Tulach <jtulach@netbeans.org>
    12  */
    13 final class AsyncEventSupport implements EventSupport {
    14     private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
    15     
    16     AsyncEventSupport() {
    17     }
    18     @Override
    19     public void add(ModificationListener l) {
    20         listeners.add(l);
    21     }
    22 
    23     @Override
    24     public void remove(ModificationListener l) {
    25         listeners.remove(l);
    26     }
    27 
    28     // BEGIN: openfixed.asynch
    29     private static final Executor EXEC = Executors.newSingleThreadExecutor();
    30     @Override
    31     public void fireModificationEvent(ModificationEvent ev) {
    32         EXEC.execute(new Deliverable(
    33             ev, listeners.toArray(new ModificationListener[0])
    34         ));
    35     }
    36     
    37     private static class Deliverable implements Runnable {
    38         final ModificationEvent ev;
    39         final ModificationListener[] listeners;
    40 
    41         public Deliverable(
    42             ModificationEvent ev, ModificationListener[] listeners
    43         ) {
    44             this.ev = ev;
    45             this.listeners = listeners;
    46         }
    47 
    48         @Override
    49         public void run() {
    50             for (ModificationListener l : listeners) {
    51                 l.modification(ev);
    52             }
    53         }
    54     }
    55     // END: openfixed.asynch
    56 }