mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-11 15:22:13 +03:00
app
preproc
syntax
tools
ArduinoMessageSiphon.java
Base.java
Command.java
Compiler.java
Editor.java
EditorButtons.java
EditorConsole.java
EditorHeader.java
EditorLineStatus.java
EditorListener.java
EditorStatus.java
FindReplace.java
Library.java
LibraryManager.java
MessageConsumer.java
MessageSiphon.java
MessageStream.java
Preferences.java
PresentMode.java
Runner.java
RunnerClassLoader.java
RunnerException.java
Serial.java
Sizer.java
Sketch.java
SketchCode.java
SketchHistory.java
Sketchbook.java
SwingWorker.java
Target.java
UpdateCheck.java
Uploader.java
bootloader
bootloaderBT
build
targets
license.txt
readme.txt
todo.txt
132 lines
3.4 KiB
Java
132 lines
3.4 KiB
Java
package processing.app;
|
|
|
|
import javax.swing.SwingUtilities;
|
|
|
|
/**
|
|
* This is the 3rd version of SwingWorker (also known as
|
|
* SwingWorker 3), an abstract class that you subclass to
|
|
* perform GUI-related work in a dedicated thread. For
|
|
* instructions on and examples of using this class, see:
|
|
*
|
|
* http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
|
|
*
|
|
* Note that the API changed slightly in the 3rd version:
|
|
* You must now invoke start() on the SwingWorker after
|
|
* creating it.
|
|
*/
|
|
public abstract class SwingWorker {
|
|
private Object value; // see getValue(), setValue()
|
|
|
|
/**
|
|
* 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; }
|
|
}
|
|
|
|
private ThreadVar threadVar;
|
|
|
|
/**
|
|
* 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 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);
|
|
}
|
|
|
|
/**
|
|
* Start the worker thread.
|
|
*/
|
|
public void start() {
|
|
Thread t = threadVar.get();
|
|
if (t != null) {
|
|
t.start();
|
|
}
|
|
}
|
|
}
|