@@ -0,0 +1,2861 @@
+//%0A// ThreadService.java%0A//%0A%0A/*%0AImageJ software for multidimensional image processing and analysis.%0A%0ACopyright (c) 2010, ImageJDev.org.%0AAll rights reserved.%0A%0ARedistribution and use in source and binary forms, with or without%0Amodification, are permitted provided that the following conditions are met:%0A    * Redistributions of source code must retain the above copyright%0A      notice, this list of conditions and the following disclaimer.%0A    * Redistributions in binary form must reproduce the above copyright%0A      notice, this list of conditions and the following disclaimer in the%0A      documentation and/or other materials provided with the distribution.%0A    * Neither the names of the ImageJDev.org developers nor the%0A      names of its contributors may be used to endorse or promote products%0A      derived from this software without specific prior written permission.%0A%0ATHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS %22AS IS%22%0AAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE%0AIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE%0AARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE%0ALIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR%0ACONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF%0ASUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS%0AINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN%0ACONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)%0AARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE%0APOSSIBILITY OF SUCH DAMAGE.%0A*/%0A%0Apackage imagej.thread;%0A%0Aimport imagej.AbstractService;%0Aimport imagej.ImageJ;%0Aimport imagej.Service;%0A%0Aimport java.util.concurrent.Callable;%0Aimport java.util.concurrent.ExecutorService;%0Aimport java.util.concurrent.Executors;%0Aimport java.util.concurrent.Future;%0Aimport java.util.concurrent.ThreadFactory;%0A%0A/**%0A * Service for managing active ImageJ threads.%0A * %0A * @author Curtis Rueden%0A */%0A@Service%0Apublic final class ThreadService extends AbstractService implements%0A%09ThreadFactory%0A%7B%0A%0A%09private ExecutorService executor;%0A%0A%09private int nextThread = 0;%0A%0A%09// -- Constructors --%0A%0A%09public ThreadService() %7B%0A%09%09// NB: Required by SezPoz.%0A%09%09super(null);%0A%09%09throw new UnsupportedOperationException();%0A%09%7D%0A%0A%09public ThreadService(final ImageJ context) %7B%0A%09%09super(context);%0A%09%7D%0A%0A%09// -- ThreadService methods --%0A%0A%09public %3CV%3E Future%3CV%3E run(final Callable%3CV%3E code) %7B%0A%09%09return executor.submit(code);%0A%09%7D%0A%0A%09// -- IService methods --%0A%0A%09@Override%0A%09public void initialize() %7B%0A%09%09executor = Executors.newCachedThreadPool(this);%0A%09%7D%0A%0A%09// -- ThreadFactory methods --%0A%0A%09@Override%0A%09public Thread newThread(final Runnable r) %7B%0A%09%09final String threadName =%0A%09%09%09%22ImageJ-%22 + getContext().getID() + %22-Thread-%22 + nextThread++;%0A%09%09return new Thread(r, threadName);%0A%09%7D%0A%0A%7D%0A

Add a simple ThreadService.