在应用程序变为空闲之前,实现一些util方法暂停测试(当前线程)执行是否可行?
空闲意味着:
1.在一段时间内没有向事件队列添加GUI事件
2.在同一段时间内没有工作线程运行任何任务
您能否提供实施/代码片段来跟踪以前的闲置情况?
答案 0 :(得分:2)
您可以将EventQueue
替换为您自己的实施,如图here所示。下面的变体添加了idle()
方法,该方法依赖于1000毫秒的任意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;
}
}
}
答案 1 :(得分:1)
您可以使用Toolkit.getDefaultToolkit().addAWTEventListener(listener, eventMask)
订阅AWT事件队列,这样您就可以检测是否在一段时间内未添加事件。
我认为您需要自定义代码来监视工作线程,即run()
方法的开头和结尾。
问题是“暂停测试执行”。如果你的测试在理论上运行,你可以调用线程的suspend()
方法。但它已被弃用,不应使用。要执行明确的实现,您应该使自定义代码在执行线程期间询问状态,并在检测到必须暂停测试时调用wait()
。当您监视AWT事件队列和工作线程的代码决定可以恢复测试时,它应该调用适当的notify()
。
从设计的角度来看,可能更好的解决方案是Actors模型。有几个java框架提供此功能。