?? swingworker.java
字號:
package net.sourceforge.jwap.util;import javax.swing.SwingUtilities;public abstract class SwingWorker { private Object value; private ThreadVar threadVar; /**
* Start a thread that will call the <code>construct</code> method
* and then exit.
*/ public SwingWorker() { final Runnable doFinished = new Runnable() { public void run() { finished(); } }; Runnable doConstruct = new Runnable() { public void run() { try { setValue(construct()); } finally { threadVar.clear(); } SwingUtilities.invokeLater(doFinished); } }; Thread t = new Thread(doConstruct); threadVar = new ThreadVar(t); } /**
* Get the value produced by the worker thread, or null if it
* hasn't been constructed yet.
*/ protected synchronized Object getValue() { return value; } /**
* Set the value produced by worker thread
*/ private synchronized void setValue(Object x) { value = x; } /**
* Compute the value to be returned by the <code>get</code> method.
*/ public abstract Object construct(); /**
* Called on the event dispatching thread (not on the worker thread)
* after the <code>construct</code> method has returned.
*/ public void finished() { } /**
* A new method that interrupts the worker thread. Call this method
* to force the worker to stop what it's doing.
*/ public void interrupt() { Thread t = threadVar.get(); if (t != null) { t.interrupt(); } threadVar.clear(); } /**
* Return the value created by the <code>construct</code> method.
* Returns null if either the constructing thread or the current
* thread was interrupted before a value was produced.
*
* @return the value created by the <code>construct</code> method
*/ public Object get() { while (true) { Thread t = threadVar.get(); if (t == null) { return getValue(); } try { t.join(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // propagate return null; } } } /**
* Start the worker thread.
*/ public void start() { Thread t = threadVar.get(); if (t != null) { t.start(); } } /**
* Class to maintain reference to current worker thread
* under separate synchronization control.
*/ private static class ThreadVar { private Thread thread; ThreadVar(Thread t) { thread = t; } synchronized Thread get() { return thread; } synchronized void clear() { thread = null; } }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -