1 package org.ozoneDB.adminGui.util; 9 10 import javax.swing.*; 11 12 17 public abstract class ThreadWorker { 18 private Object value; 19 private ThreadVar threadVar; 20 21 25 private static class ThreadVar { 26 private Thread thread; 27 28 ThreadVar(Thread t) { 29 thread = t; 30 } 31 32 synchronized Thread get() { 33 return thread; 34 } 35 36 synchronized void clear() { 37 thread = null; 38 } 39 } 40 41 45 protected synchronized Object getValue() { 46 return value; 47 } 48 49 52 private synchronized void setValue(Object x) { 53 value = x; 54 } 55 56 59 public abstract Object construct(); 60 61 65 public void finished() { 66 } 67 68 72 public void interrupt() { 73 Thread t = threadVar.get(); 74 if (t != null) { 75 t.interrupt(); 76 } 77 threadVar.clear(); 78 } 79 80 87 public Object get() { 88 while (true) { 89 Thread t = threadVar.get(); 90 if (t == null) { 91 return getValue(); 92 } 93 try { 94 t.join(); 95 } catch (InterruptedException e) { 96 Thread.currentThread().interrupt(); return null; 98 } 99 } 100 } 101 102 103 107 public ThreadWorker() { 108 final Runnable doFinished = new Runnable () { 109 public void run() { 110 finished(); 111 } 112 }; 113 114 Runnable doConstruct = new Runnable () { 115 public void run() { 116 try { 117 setValue(construct()); 118 } finally { 119 threadVar.clear(); 120 } 121 122 SwingUtilities.invokeLater(doFinished); 123 } 124 }; 125 126 Thread t = new Thread (doConstruct); 127 threadVar = new ThreadVar(t); 128 } 129 130 133 public void start() { 134 Thread t = threadVar.get(); 135 if (t != null) { 136 t.start(); 137 } 138 } 139 } 140 | Popular Tags |