1 14 package org.compiere.apps; 15 16 import javax.swing.SwingUtilities ; 17 18 41 public abstract class SwingWorker 42 { 43 47 public SwingWorker() 48 { 49 final Runnable doFinished = new Runnable () 50 { 51 public void run() 52 { 53 finished(); 54 } 55 }; 56 57 Runnable doConstruct = new Runnable () 58 { 59 public void run() 60 { 61 try 62 { 63 setValue(construct()); 64 } 65 finally 66 { 67 m_threadVar.clear(); 68 } 69 SwingUtilities.invokeLater(doFinished); 70 } 71 }; 72 73 Thread t = new Thread (doConstruct); 74 m_threadVar = new ThreadVar(t); 75 } 77 private ThreadVar m_threadVar; 78 private Object m_value; 80 84 public abstract Object construct(); 85 86 90 public void finished() 91 { 92 } 93 94 99 protected synchronized Object getValue() 100 { 101 return m_value; 102 } 104 108 private synchronized void setValue(Object x) 109 { 110 m_value = x; 111 } 113 114 115 118 public void start() 119 { 120 Thread t = m_threadVar.get(); 121 if (t != null) 122 t.start(); 123 } 125 132 public Object get() 133 { 134 while (true) 135 { 136 Thread t = m_threadVar.get(); 137 if (t == null) 138 { 139 return getValue(); 140 } 141 try 142 { 143 t.join(); 144 } 145 catch (InterruptedException e) 146 { 147 Thread.currentThread().interrupt(); return null; 149 } 150 } 151 } 153 157 public void interrupt() 158 { 159 Thread t = m_threadVar.get(); 160 if (t != null) 161 { 162 t.interrupt(); 163 } 164 m_threadVar.clear(); 165 } 167 171 public boolean isAlive() 172 { 173 Thread t = m_threadVar.get(); 174 if (t == null) 175 return false; 176 return t.isAlive(); 177 } 179 180 181 185 private static class ThreadVar 186 { 187 ThreadVar(Thread t) 188 { 189 thread = t; 190 } 191 192 private Thread thread; 193 194 synchronized Thread get() 195 { 196 return thread; 197 } 198 synchronized void clear() 199 { 200 thread = null; 201 } 202 } 204 } | Popular Tags |