package logbook.thread; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * スレッドを管理します * */ public final class ThreadManager { private static List<Thread> threads = new ArrayList<Thread>(); private static Map<Thread, ExceptionHandler> handlermap = new HashMap<Thread, ExceptionHandler>(); /** * スレッドを管理下に置きます * * @param thread */ public static void regist(Thread thread) { threads.add(thread); } /** * 管理しているスレッドを開始します */ public static void start() { for (Thread thread : threads) { if (!thread.isAlive()) { thread.setDaemon(true); ExceptionHandler handler = new ExceptionHandler(); handlermap.put(thread, handler); thread.setUncaughtExceptionHandler(handler); thread.start(); } } } /** * 管理しているスレッドを取得します * @return */ static List<Thread> getThreads() { return Collections.unmodifiableList(threads); } /** * 例外ハンドラを取得します * * @param thread * @return */ static ExceptionHandler getUncaughtExceptionHandler(Thread thread) { return handlermap.get(thread); } /** * エラーハンドラ * */ public static final class ExceptionHandler implements Thread.UncaughtExceptionHandler { private Throwable throwable; @Override public void uncaughtException(Thread t, Throwable e) { this.throwable = e; } @Override public String toString() { if (this.throwable == null) { return ""; } StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter); this.throwable.printStackTrace(printWriter); printWriter.close(); return stringWriter.toString(); } } }