Java API“如果不在EDT上运行在EDT上”

只是对我的一些重复代码的思考:

Runnable run = new Runnable() { @Override public void run() { // Some EDT code } }; if (!EventQueue.isDispatchThread()) { SwingUtilities.invokeAndWait(run); } else { run.run(); } 

它并不是非常烦人,但似乎有一些专有function会为你检查这个,虽然我还没有找到它。

似乎会有一些专有function为您检查这一点

没有。

排除物质外观和感觉我从不需要使用invokeAndWait或测试isDispatchThread / isEventDispatchThread

在某些特殊情况下需要物质外观和感觉对于JTableJTreeSwingX's TreeTable使用invokeAndWait ,在这种情况下真的不重要

“EDT到期”需要延迟30秒然后你可以创建n_Threads,然后每个都可以运行EDT,简单,无需特别的努力,另一个限制可能是来自Native OS的延迟

产量

 run: Time at : 00:00:45 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Time at : 00:00:45 EventQueue.isDispatchThread SwingUtilities.isEventDispatchThread Time at : 00:00:45 EventQueue.isDispatchThread SwingUtilities.isEventDispatchThread Time at : 00:01:15 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Push a new event to EDT Time at : 00:01:45 EventQueue.isDispatchThread SwingUtilities.isEventDispatchThread Time at : 00:02:15 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Time at : 00:02:45 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Push a new event to EDT Time at : 00:03:15 EventQueue.isDispatchThread SwingUtilities.isEventDispatchThread Time at : 00:03:45 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Time at : 00:04:15 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Push a new event to EDT Time at : 00:04:45 EventQueue.isDispatchThread SwingUtilities.isEventDispatchThread Terminating this madness BUILD SUCCESSFUL (total time: 4 minutes 31 seconds) 

 import java.awt.EventQueue; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; public class IsThereEDT { private ScheduledExecutorService scheduler; private AccurateScheduledRunnable periodic; private ScheduledFuture periodicMonitor; private int taskPeriod = 30; private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); private Date dateRun; private JFrame frame1 = new JFrame("Frame 1"); public IsThereEDT() { scheduler = Executors.newSingleThreadScheduledExecutor(); periodic = new AccurateScheduledRunnable() { private final int ALLOWED_TARDINESS = 200; private int countRun = 0; private int countCalled = 0; private int maxCalled = 10; @Override public void run() { countCalled++; if (countCalled < maxCalled) { if (countCalled % 3 == 0) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { System.out.println("Push a new event to EDT"); frame1.repaint(); isThereReallyEDT(); } }); } else { if (this.getExecutionTime() < ALLOWED_TARDINESS) { countRun++; isThereReallyEDT(); // non on EDT } } } else { System.out.println("Terminating this madness"); System.exit(0); } } }; periodicMonitor = scheduler.scheduleAtFixedRate(periodic, 0, taskPeriod, TimeUnit.SECONDS); periodic.setThreadMonitor(periodicMonitor); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { isThereReallyEDT(); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.getContentPane().add(new JLabel("Hello in frame 1")); frame1.pack(); frame1.setLocation(100, 100); frame1.setVisible(true); } }); try { Thread.sleep(500); } catch (InterruptedException ex) { Logger.getLogger(IsThereEDT.class.getName()).log(Level.SEVERE, null, ex); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame2 = new JFrame("Frame 2"); frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame2.getContentPane().add(new JLabel("Hello in frame 2")); frame2.pack(); frame2.setLocation(200, 200); frame2.setVisible(true); isThereReallyEDT(); } }); } private void isThereReallyEDT() { dateRun = new java.util.Date(); System.out.println(" Time at : " + sdf.format(dateRun)); if (EventQueue.isDispatchThread()) { System.out.println("EventQueue.isDispatchThread"); } else { System.out.println("There isn't Live EventQueue.isDispatchThread, why any reason for that "); } if (SwingUtilities.isEventDispatchThread()) { System.out.println("SwingUtilities.isEventDispatchThread"); } else { System.out.println("There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that "); } System.out.println(); } public static void main(String[] args) { IsThereEDT isdt = new IsThereEDT(); } } abstract class AccurateScheduledRunnable implements Runnable { private ScheduledFuture thisThreadsMonitor; public void setThreadMonitor(ScheduledFuture monitor) { this.thisThreadsMonitor = monitor; } protected long getExecutionTime() { long delay = -1 * thisThreadsMonitor.getDelay(TimeUnit.MILLISECONDS); return delay; } } 

你可以做任何事情,改变命令,方法,通过Thread.sleep(int)冻结,在所有情况下都可以在假定的时刻活着EDT,没有任何阴影,任何奇迹,错误的代码调用天堂而不是EDT