Java 等旗
我必须测试Flash播放器是否正确地通过网络发送请求。为此,我使用BrowserMob代理来捕获流量。 我的问题是,我必须等待播放的视频结束,以测试最终的请求。所以作为临时解决方案,在我的测试中,我放了一个线程.sleep(videoDuration)。但在我看来,这并不是很好,总的来说,持续时间可以改变。 BrowserMob允许在请求上添加拦截器。所以我考虑了通知和等待功能 以下是我的第一次尝试:Java 等旗,java,multithreading,wait,notify,Java,Multithreading,Wait,Notify,我必须测试Flash播放器是否正确地通过网络发送请求。为此,我使用BrowserMob代理来捕获流量。 我的问题是,我必须等待播放的视频结束,以测试最终的请求。所以作为临时解决方案,在我的测试中,我放了一个线程.sleep(videoDuration)。但在我看来,这并不是很好,总的来说,持续时间可以改变。 BrowserMob允许在请求上添加拦截器。所以我考虑了通知和等待功能 以下是我的第一次尝试: protected static boolean percent100Done; prote
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%变量真的很聪明。关于锁和条件,如果我理解正确的话,对你们来说,仅仅出于性能原因使用它们是没有意义的?如果我们只讨论可读性,锁和条件是否有帮助?@tetiennesynchronized
可能更容易阅读,因为它是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
}