package logbook.thread; import java.util.ArrayList; import java.util.List; import logbook.thread.ThreadManager.ExceptionHandler; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; /** * スレッドの状態を監視します * */ public final class ThreadStateObserver extends Thread { private final Shell shell; private final List<Thread> observthread; /** * コンストラクター */ public ThreadStateObserver(Shell shell) { this.observthread = new ArrayList<Thread>(ThreadManager.getThreads()); this.shell = shell; this.setName("logbook_thread_state_observer"); } /* (非 Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { try { while (true) { for (int i = 0; i < this.observthread.size(); i++) { Thread target = this.observthread.get(i); if (!target.isAlive()) { ExceptionHandler handler = ThreadManager.getUncaughtExceptionHandler(target); String stackTrace = handler.toString(); if (!"".equals(stackTrace)) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append("["); sb.append(target.getName()); sb.append("]"); sb.append("が予期せず終了しました、エラーログを確認して下さい。\n"); sb.append("補足した例外:\n"); sb.append(stackTrace); final String message = sb.toString(); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { MessageBox box = new MessageBox(ThreadStateObserver.this.shell, SWT.YES | SWT.ICON_ERROR); box.setText("スレッドが予期せず終了しました"); box.setMessage(message); box.open(); } }); } this.observthread.remove(i); } } Thread.sleep(2000); } } catch (InterruptedException e) { e.printStackTrace(); } } }