等待一面旗帜

时间:2015-03-19 17:18:27

标签: java multithreading wait notify

我必须测试Flash Player是否正在通过网络正确发送请求。为此,我使用BrowserMob Proxy来捕获流量。 我的问题是我必须等待播放的视频结束才能测试最终请求。所以作为临时解决方案,在我的测试中,我放了一个Thread.sleep(videoDuration)。但IMO并不是很好,总的来说,持续时间可能会发生变化。 BrowserMob允许在请求上添加拦截器。所以我想到了通知和等待功能。

这是我的第一次尝试:

protected static boolean percent100Done;

protected static final Object percent100lock = new Object();

@BeforeClass
public static void addInterceptor() {
    ProxyServer server = Server.init();
    server.addRequestInterceptor((BrowserMobHttpRequest request, Har har) -> {
        String percent = request.getProxyRequest().getParameter("percent");
        if("100".equals(percent)) {
            percent100Done = true;
            synchronized (percent100lock) {
                percent100lock.notify();
            }
        }
    });
}

@Test
public void testFinalRequest() throws InterruptedException {
    driver.get(myurl);
    synchronized (percent100lock) {
        while (!percent100Done) {
            percent100lock.wait();
        }
    }
    //test continue
}

我测试了这段代码,它确实有效。但它看起来有点脏,特别是新的Object系列。如果我必须添加25%,50%和75%的通知,会发生什么?我将不得不另外3个布尔和锁?

1 个答案:

答案 0 :(得分:1)

为什么不存储百分比并拥有一般的“进度”事件,例如how XMLHTTPRequest works

protected static int percent;
protected static final Object progressLock = new Object();

@BeforeClass
public static void addInterceptor() {
    ProxyServer server = Server.init();
    server.addRequestInterceptor((BrowserMobHttpRequest request, Har har) -> {
        synchronized(progressLock) {
            percent = Integer.parseInt(request.getProxyRequest().getParameter("percent"));
            progressLock.notify();
        }
    });
}

@Test
public void testFinalRequest() throws InterruptedException {
    driver.get(myurl);
    synchronized (progressLock) {
        int lastPercent = -1;
        while (percent != 100) {
            if (lastPercent < 50 && percent >= 50) {
                System.out.println("50%");
            }
            lastPercent = percent;
            progressLock.wait();
        }
    }
    //test continue
}

就古怪而言,我认为你的解决方案很好。它看起来很奇怪,但每个Object都有一个锁,所以你不妨使用它。如果您需要做一些更复杂的事情,您可能需要查看Lock及其子类。例如,对于ReadWriteLock,多个读者可以同时持有锁,但只有一个作者可以。虽然看起来你没有多个读者(我不希望锁定会影响这个程序的性能)。