Java API "Starting on EDT, if not EDT"

Just thinking about some duplicate code that I have:

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

This is not terribly annoying, but it looks like there will be some kind of proprietary function that tests this for you, although I have not found it.

+4
source share
3 answers

it looks like there will be some kind of proprietary function that will test this for you

Not.

+3
source

Without considering the look and feel of the substance, I never had to use invokeAndWait or testing for isDispatchThread / isEventDispatchThread ,

The look of the substance and the feeling required in some special cases, the use of invokeAndWait for JTable , JTree , SwingX TreeTable , really does not matter in this case

A delay of 30 seconds is required for the "expiration of the EDT", then you can create n_Threads, each of which can be a live EDT, simple, without much effort, another limit can be a delay from the native OS

Exit

 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) 

from

 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; } } 

you can do everything by changing the order, methods, freezing Thread.sleep(int) , in all cases it is possible to animate EDT at the expected moment, not to obscure anything, no miracles, wrong code calling Heaven, not EDT

+2
source

Source: https://habr.com/ru/post/1402550/


All Articles