gpt4 book ai didi

java - 设置多线程秒表实例(在执行 doCommandWithoutWaitingForAReponse 异常期间,commandHolder 被填满)

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:38 24 4
gpt4 key购买 nike

我正在尝试做一些概念上简单的事情......我们在仪表板上加载了多个 portlet。我需要测量每个所需的加载时间。我已经实现了一个简单的 StopWatch 类,并且需要在加载仪表板时为每个 portlet 同时运行它的多个实例。因此提供的参数将是:

  1. portlet 名称
  2. 要检查的元素,表示加载成功。

这是StopWatch 类:

 public class StopWatch implements Runnable {
private long startTime;
private long stopTime;
private String tElement;
private String tPortletName;

public StopWatch(String portletName,String element) {
tElement = element;
tPortletName = portletName;

}

public void start() {
startTime = System.currentTimeMillis();
}
public void stop() {
stopTime = System.currentTimeMillis();
}
public long getTime() {
return stopTime - startTime;
}

@Override
public void run() {
selenium.selectFrame(tPortletName);
StopWatch sw = new StopWatch();
sw.start();
while (selenium.isElementPresent(tElement)==false)
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sw.stop();
long time = sw.getTime();
System.out.println(tPortletName+" load time="+time);
}
}

在调用程序中,

StopWatch sw1 = new StopWatch(portlet1,element1);
StopWatch sw2 = new StopWatch(portlet2,element2);
ExecutorService threadExecutor = Executors.newFixedThreadPool(3);

threadExecutor.execute(sw1); // start task1
threadExecutor.execute(sw2); // start task2

运行此命令后,出现以下异常:

com.thoughtworks.selenium.SeleniumException: ERROR Server Exception: commandHolder got filled during execution of doCommandWithoutWaitingForAReponse

有什么线索可以解释造成这种情况的原因吗?

最佳答案

最有可能的原因是您发送命令的速度快于 Selenium 处理它们的速度。

无论如何,这种方法不应该起作用,因为 DefaulSelenium 和其他 Selenium 类不同步,所以如果你很可能会遇到死锁或不可预测的结果。

我认为您必须分两步进行测试:加载仪表板,等待第一个 portlet,然后重新加载仪表板并等待第二个 portlet。在主线程中完成所有这些操作,例如:

private void waitForPortlet(String portletName, String element) {
long startTime = System.currentTimeMillis();

while (selenium.isElementPresent(element) == false)
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}

long stopTime = System.currentTimeMillis();

System.out.println(portletName + " load time=" + (stopTime - startTime));
}

并使用:

    waitForPortlet(name1, element1);

selenium.refresh();

waitForPortlet(name2, element2);

关于java - 设置多线程秒表实例(在执行 doCommandWithoutWaitingForAReponse 异常期间,commandHolder 被填满),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3425478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com