Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等旗_Java_Multithreading_Wait_Notify - Fatal编程技术网

Java 等旗

Java 等旗,java,multithreading,wait,notify,Java,Multithreading,Wait,Notify,我必须测试Flash播放器是否正确地通过网络发送请求。为此,我使用BrowserMob代理来捕获流量。 我的问题是,我必须等待播放的视频结束,以测试最终的请求。所以作为临时解决方案,在我的测试中,我放了一个线程.sleep(videoDuration)。但在我看来,这并不是很好,总的来说,持续时间可以改变。 BrowserMob允许在请求上添加拦截器。所以我考虑了通知和等待功能 以下是我的第一次尝试: protected static boolean percent100Done; prote

我必须测试Flash播放器是否正确地通过网络发送请求。为此,我使用BrowserMob代理来捕获流量。 我的问题是,我必须等待播放的视频结束,以测试最终的请求。所以作为临时解决方案,在我的测试中,我放了一个线程.sleep(videoDuration)。但在我看来,这并不是很好,总的来说,持续时间可以改变。 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
}

我测试了这段代码,它运行正常。但它似乎有点脏,尤其是新的对象线。如果我必须添加25%、50%和75%的通知,会发生什么?我将需要另外3个布尔值并锁定?

为什么不存储百分比并有一个通用的“进度”事件,如

受保护的静态整数百分比;
受保护的静态最终对象progressLock=新对象();
@课前
公共静态void addInterceptor(){
ProxyServer=server.init();
addRequestInterceptor((BrowserMobHttpRequest请求,Har)->{
已同步(进程锁){
百分比=整数.parseInt(request.getProxyRequest().getParameter(“百分比”));
progressLock.notify();
}
});
}
@试验
public void testFinalRequest()引发InterruptedException{
获取(myurl);
已同步(进程锁){
int lastPercent=-1;
而(百分比!=100){
如果(最后百分比<50&&百分比>=50){
System.out.println(“50%”);
}
最后百分比=百分比;
progressLock.wait();
}
}
//继续测试
}

就奇怪而言,我认为你的解决方案很好。它看起来很奇怪,但是每个
对象都有一个锁,所以您不妨使用它。如果你需要做一些更复杂的事情,你可能想看看它的子类。例如,对于,多个读卡器可以同时持有锁,但只有一个写卡器可以。不过,看起来您没有多个读卡器(我也不希望锁定会对该程序的性能产生太大影响)。

谢谢您的提示。使用百分比变量而不是100%变量真的很聪明。关于锁和条件,如果我理解正确的话,对你们来说,仅仅出于性能原因使用它们是没有意义的?如果我们只讨论可读性,锁和条件是否有帮助?@tetienne
synchronized
可能更容易阅读,因为它是Java自动处理的块。对于
锁定
对象,您需要
尝试
/
最后
以在发生
中断异常
(或
运行时异常
时正确解锁它。就性能而言,最好对其进行基准测试,但我怀疑在这种情况下性能是否重要。
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
}