1

我正在尝试使用线程并行运行 JUnit 测试脚本(基本上所有测试脚本都与 Selenium WebDriver 相关),为此我使用ExecutorService创建了一个大小的线程池,下面是我创建线程池的代码

ExecutorService executor = Executors.newFixedThreadPool(4);
for (int threadpoolCount = 0; threadpoolCount < classNames.size(); threadpoolCount++) {
        Runnable worker = new ProcessRunnable(classNames.get(threadpoolCount));
        executor.execute(worker);
    }
    executor.shutdown();
    while (!executor.isTerminated()) {
    }

这是我的触发Junit类的线程实现

public class ProcessRunnable implements Runnable{
private String classNames;
public ProcessRunnable(String className) {
    this.classNames = className;
}

public void run() {
    try {
        Class testcase = Class.forName(classNames);
        JUnitCore.runClasses(testcase);

    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

我面临的问题是,虽然线程池在初始化时保持 4 个线程的大小,但它同时执行所有线程,这在浏览器启动时会产生一些同步问题。所以我的想法是在线程执行之间添加一些延迟。

由于我在线程池中创建了一个新的可运行线程,我不确定如何在线程之间添加等待或延迟,我无法解决这个问题。请帮助我,感谢您的帮助。

4

1 回答 1

0

如果您想要一个串行解决方案(如果您需要延迟,您可能需要),请使用Executors.newSingleThreadExecutor(). 否则你可以sleep像这样的线程:

Thread.sleep(1000L); //1 second (takes long, not int)

或根据您的线程数增加的值。

更好的解决方案是使用ScheduledThreadPoolExecutor.schedule(Runnable)。您以自定义(静态或增加)延迟提交它们。将核心大小设置为 4,它的行为就像一个固定的线程池;来自文档:

虽然这个类继承自 ThreadPoolExecutor,但一些继承的调优方法对它没有用。特别是,因为它充当使用 corePoolSize 线程和无界队列的固定大小的池,所以对 maximumPoolSize 的调整没有有用的效果。此外,将 corePoolSize 设置为零或使用 allowCoreThreadTimeOut 几乎不是一个好主意,因为一旦它们有资格运行,这可能会使池没有线程来处理任务。

于 2013-11-08T23:04:09.723 回答