暂停测试执行直到应用程序变为空闲

实现一些util方法暂停测试(当前线程)执行直到应用程序变为空闲是否可行?
空闲意味着:
1.在一段时间内没有向事件队列添加GUI事件
2.在同一段时间内没有工作线程运行任何任务。
您能否提供实施/代码片段来跟踪以前的闲置情况?

您可以使用自己的实现替换EventQueue ,如下所示。 下面的变化添加了一个idle()方法,该方法依赖于1000 ms的任意THRESHOLD

 import java.awt.AWTEvent; import java.awt.EventQueue; import java.awt.Toolkit; import java.lang.reflect.InvocationTargetException; import javax.swing.JFrame; import javax.swing.JTree; /** * @see https://stackoverflow.com/questions/7976967 * @see https://stackoverflow.com/questions/3158254 */ public class EventQueueTest { public static void main(String[] args) throws InterruptedException, InvocationTargetException { EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); final MyEventQueue q = new MyEventQueue(); eventQueue.push(q); EventQueue.invokeAndWait(new Runnable() { @Override public void run() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new JTree()); f.pack(); f.setVisible(true); } }); // Test idle() on initial thread for (int i = 0; i < 10; i++) { Thread.sleep(2 * MyEventQueue.THRESHOLD); System.out.println("Idle: " + q.idle()); } } private static class MyEventQueue extends EventQueue { private static final int THRESHOLD = 1 * 1000; private long last; @Override public void postEvent(AWTEvent e) { super.postEvent(e); last = System.currentTimeMillis(); } public boolean idle() { return System.currentTimeMillis() - last > THRESHOLD; } } } 

您可以使用Toolkit.getDefaultToolkit().addAWTEventListener(listener, eventMask)来订阅AWT事件队列,这样您就可以检测是否在一段时间内未添加事件。

我认为您需要自定义代码来监视工作线程,即run()方法的开头和结尾。

问题是“暂停测试执行”。 如果你的测试在理论上运行,你可以调用线程的suspend()方法。 但它已被弃用,不应使用。 要执行明确的实现,您应该使自定义代码在执行线程期间询问状态,并在检测到必须暂停测试时调用wait() 。 当您监视AWT事件队列和工作线程的代码决定可以恢复测试时,它应该调用适当的notify()

从设计的角度来看,可能更好的解决方案是Actors模型。 有几个java框架提供此function。