|
37 | 37 | import java.util.ArrayList; |
38 | 38 | import java.util.LinkedList; |
39 | 39 | import java.util.List; |
| 40 | +import java.util.concurrent.CopyOnWriteArrayList; |
40 | 41 |
|
41 | 42 | import org.scijava.Context; |
42 | 43 | import org.scijava.console.OutputEvent.Source; |
@@ -69,9 +70,7 @@ public class DefaultConsoleService extends |
69 | 70 | private OutputStreamReporter out, err; |
70 | 71 |
|
71 | 72 | /** List of listeners for {@code stdout} and {@code stderr} output. */ |
72 | | - private ArrayList<OutputListener> listeners; |
73 | | - |
74 | | - private OutputListener[] cachedListeners; |
| 73 | + private List<OutputListener> listeners; |
75 | 74 |
|
76 | 75 | // -- ConsoleService methods -- |
77 | 76 |
|
@@ -116,26 +115,19 @@ public void processArgs(final String... args) { |
116 | 115 | @Override |
117 | 116 | public void addOutputListener(final OutputListener l) { |
118 | 117 | if (listeners == null) initListeners(); |
119 | | - synchronized (listeners) { |
120 | | - listeners.add(l); |
121 | | - cacheListeners(); |
122 | | - } |
| 118 | + listeners.add(l); |
123 | 119 | } |
124 | 120 |
|
125 | 121 | @Override |
126 | 122 | public void removeOutputListener(final OutputListener l) { |
127 | 123 | if (listeners == null) initListeners(); |
128 | | - synchronized (listeners) { |
129 | | - listeners.remove(l); |
130 | | - cacheListeners(); |
131 | | - } |
| 124 | + listeners.remove(l); |
132 | 125 | } |
133 | 126 |
|
134 | 127 | @Override |
135 | 128 | public void notifyListeners(final OutputEvent event) { |
136 | 129 | if (listeners == null) initListeners(); |
137 | | - final OutputListener[] toNotify = cachedListeners; |
138 | | - for (final OutputListener l : toNotify) |
| 130 | + for (final OutputListener l : listeners) |
139 | 131 | l.outputOccurred(event); |
140 | 132 | } |
141 | 133 |
|
@@ -163,16 +155,11 @@ private synchronized void initListeners() { |
163 | 155 | err = new OutputStreamReporter(Source.STDERR); |
164 | 156 | syserr.getParent().addOutputStream(err); |
165 | 157 |
|
166 | | - listeners = new ArrayList<>(); |
167 | | - cachedListeners = listeners.toArray(new OutputListener[0]); |
| 158 | + listeners = new CopyOnWriteArrayList<>(); |
168 | 159 | } |
169 | 160 |
|
170 | 161 | // -- Helper methods -- |
171 | 162 |
|
172 | | - private void cacheListeners() { |
173 | | - cachedListeners = listeners.toArray(new OutputListener[listeners.size()]); |
174 | | - } |
175 | | - |
176 | 163 | private MultiPrintStream multiPrintStream(final PrintStream ps) { |
177 | 164 | if (ps instanceof MultiPrintStream) return (MultiPrintStream) ps; |
178 | 165 | return new MultiPrintStream(ps); |
|
0 commit comments