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();
    }
}

}

私が直面している問題は、Threadpool が初期化時に 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 を 0 に設定したり、allowCoreThreadTimeOut を使用したりすることは、ほとんどの場合、良い考えではありません。これは、タスクが実行可能になると、タスクを処理するためのスレッドがプールに残らない可能性があるためです。

于 2013-11-08T23:04:09.723 に答える