src/share/classes/java/awt/EventDispatchThread.java
Print this page
@@ -32,12 +32,14 @@
import java.lang.reflect.Method;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
import sun.awt.AWTAutoShutdown;
import sun.awt.SunToolkit;
+import sun.awt.AppContext;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.List;
import sun.util.logging.PlatformLogger;
import sun.awt.dnd.SunDragSourceContextPeer;
import sun.awt.EventQueueDelegate;
@@ -64,15 +66,15 @@
private static final PlatformLogger eventLog = PlatformLogger.getLogger("java.awt.event.EventDispatchThread");
private EventQueue theQueue;
private boolean doDispatch = true;
- private boolean threadDeathCaught = false;
+ private volatile boolean shutdown = false;
private static final int ANY_EVENT = -1;
- private Vector<EventFilter> eventFilters = new Vector<EventFilter>();
+ private ArrayList<EventFilter> eventFilters = new ArrayList<EventFilter>();
EventDispatchThread(ThreadGroup group, String name, EventQueue queue) {
super(group, name);
setEventQueue(queue);
}
@@ -82,21 +84,25 @@
*/
public void stopDispatching() {
doDispatch = false;
}
+ public void interrupt() {
+ shutdown = true;
+ super.interrupt();
+ }
+
public void run() {
while (true) {
try {
pumpEvents(new Conditional() {
public boolean evaluate() {
return true;
}
});
} finally {
- EventQueue eq = getEventQueue();
- if (eq.detachDispatchThread(this) || threadDeathCaught) {
+ if(getEventQueue().detachDispatchThread(this, shutdown)) {
break;
}
}
}
}
@@ -121,13 +127,13 @@
pumpEventsForFilter(ANY_EVENT, cond, filter);
}
void pumpEventsForFilter(int id, Conditional cond, EventFilter filter) {
addEventFilter(filter);
- doDispatch = true;
+ doDispatch = !shutdown;
while (doDispatch && cond.evaluate()) {
- if (isInterrupted() || !pumpOneEventForFilters(id)) {
+ if (shutdown || !pumpOneEventForFilters(id)) {
doDispatch = false;
}
}
removeEventFilter(filter);
}
@@ -214,15 +220,15 @@
}
return true;
}
catch (ThreadDeath death) {
- threadDeathCaught = true;
- return false;
-
+ shutdown = true;
+ throw death;
}
catch (InterruptedException interruptedException) {
+ shutdown = true;
return false; // AppContext.dispose() interrupts all
// Threads in the AppContext
}
catch (Throwable e) {