1 package org.columba.core.base; 17 18 import javax.swing.SwingUtilities ; 19 20 30 public abstract class SwingWorker { 31 protected Object value; 33 protected Thread thread; 34 35 protected boolean cancel; 36 37 protected ThreadVar threadVar; 38 39 43 public SwingWorker() { 44 cancel = false; 45 46 final Runnable doFinished = new Runnable () { 47 public void run() { 48 finished(); 49 } 50 }; 51 52 Runnable doConstruct = new Runnable () { 53 public void run() { 54 try { 55 setValue(construct()); 56 } finally { 57 } 59 60 SwingUtilities.invokeLater(doFinished); 61 } 62 }; 63 64 Thread t = new Thread (doConstruct); 65 66 t.setPriority(Thread.MIN_PRIORITY); 71 72 threadVar = new ThreadVar(t); 73 } 74 75 79 protected synchronized Object getValue() { 80 return value; 81 } 82 83 86 synchronized void setValue(Object x) { 87 value = x; 88 } 89 90 public Thread getThread() { 91 return threadVar.get(); 92 } 93 94 public ThreadVar getThreadVar() { 95 return threadVar; 96 } 97 98 public boolean getCancel() { 99 return cancel; 100 } 101 102 public void setCancel(boolean b) { 103 cancel = b; 104 } 105 106 protected boolean isCanceled() { 107 return cancel; 108 } 109 110 113 public abstract Object construct(); 114 115 119 public void finished() { 120 } 122 123 127 public void interrupt() { 128 Thread t = threadVar.get(); 129 130 if (t != null) { 131 t.interrupt(); 132 } 133 134 threadVar.clear(); 135 } 136 137 144 public Object get() { 145 while (true) { 146 Thread t = threadVar.get(); 147 148 if (t == null) { 149 return getValue(); 150 } 151 152 try { 153 t.join(); 154 } catch (InterruptedException e) { 155 Thread.currentThread().interrupt(); 157 return null; 158 } 159 } 160 } 161 162 165 public Thread start() { 166 167 thread = threadVar.get(); 168 169 if (thread != null) { 170 thread.start(); 171 172 return thread; 173 } 174 175 return null; 176 } 177 178 182 public static class ThreadVar { 183 private Thread thread; 184 185 ThreadVar(Thread t) { 186 thread = t; 187 } 188 189 synchronized Thread get() { 190 return new Thread (thread); 191 } 192 193 synchronized void clear() { 194 thread = null; 195 } 196 } 197 } 198 | Popular Tags |