package org.chartsy.chatsy.chat.util; import javax.swing.SwingUtilities; public abstract class SwingWorker { private Object value; private ThreadVar threadVar; private static class ThreadVar { private Thread thread; ThreadVar(Thread t) { thread = t; } synchronized Thread get() { return thread; } synchronized void clear() { thread = null; } } protected synchronized Object getValue() { return value; } private synchronized void setValue(Object x) { value = x; } public abstract Object construct(); public void finished() { } public void interrupt() { Thread t = threadVar.get(); if (t != null) t.interrupt(); threadVar.clear(); } public Object get() { while (true) { Thread t = threadVar.get(); if (t == null) return getValue(); try { t.join(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return null; } } } public SwingWorker() { new Runnable() { public void run() { finished(); } }; Runnable doConstruct = new Runnable() { public void run() { try { setValue(construct()); } finally { threadVar.clear(); } SwingUtilities.invokeLater(new Runnable() { public void run() { finished(); } }); } }; Thread t = new Thread(doConstruct); threadVar = new ThreadVar(t); } public void start() { Thread t = threadVar.get(); if (t != null) t.start(); } }