package rmblworx.tools.timey.gui;
import java.util.ArrayList;
import java.util.List;
/*
* Copyright 2014-2015 Christian Raue
* MIT License http://opensource.org/licenses/mit-license.php
*/
/**
* Hilfsmethoden zum Umgang mit Threads.
* @author Christian Raue {@literal <christian.raue@gmail.com>}
*/
public class ThreadHelper {
/**
* Ob Threads erfasst werden sollen. Sinnvoll für Tests.
*/
private boolean trackThreads = false;
/**
* Derzeit laufende Threads. Wichtig, um in Tests darauf warten zu können, dass sie beendet sind, bevor Annahmen überprüft werden.
*/
private final List<Thread> runningThreads = new ArrayList<>();
/**
* Führt den Task in einem separaten Thread aus, um die Anwendung nicht zu blockieren.
* @param task Task
* @param exceptionHandler Behandlung von Exceptions
*/
public void run(final Runnable task, final Thread.UncaughtExceptionHandler exceptionHandler) {
final Thread thread = new Thread(task);
if (trackThreads) {
runningThreads.add(thread);
}
thread.setDaemon(true);
thread.setUncaughtExceptionHandler(exceptionHandler);
thread.start();
}
public final void setTrackThreads(final boolean enabled) {
trackThreads = enabled;
}
/**
* Wartet auf Beendigung aller erfassten Threads.
* @throws InterruptedException Fehler beim Warten auf einen Thread.
*/
public final void waitForThreads() throws InterruptedException {
for (int i = runningThreads.size() - 1; i >= 0; --i) {
runningThreads.get(i).join();
runningThreads.remove(i);
}
}
}