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

时间:2011-11-02 07:24:53

标签: java swing jvm

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

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框架提供此功能。