org.testng.internal.thread.ThreadUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of testng Show documentation
Show all versions of testng Show documentation
Testing framework for Java
package org.testng.internal.thread; import java.util.concurrent.ThreadFactory; import org.testng.collections.Lists; import org.testng.internal.Utils; import org.testng.log4testng.Logger; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * A helper class to interface TestNG concurrency usage. * * @author tasks
. The startup is synchronized so this method * emulates a load test. * * @param tasks the list of tasks to be run * @param threadPoolSize the size of the parallel threads to be used to execute the tasks * @param timeout a maximum timeout to wait for tasks finalization * @param triggerAtOnce true if the parallel execution of tasks should be trigger at once */ public static void execute( String name, List tasks, int threadPoolSize, long timeout, boolean triggerAtOnce) { Utils.log( "ThreadUtil", 2, "Starting executor timeOut:" + timeout + "ms" + " workers:" + tasks.size() + " threadPoolSize:" + threadPoolSize); ExecutorService pooledExecutor = new ThreadPoolExecutor( threadPoolSize, threadPoolSize, timeout, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), new TestNGThreadFactory(name)); List> callables = Lists.newArrayList(); for (final Runnable task : tasks) { callables.add( () -> { task.run(); return null; }); } try { if (timeout != 0) { pooledExecutor.invokeAll(callables, timeout, TimeUnit.MILLISECONDS); } else { pooledExecutor.invokeAll(callables); } } catch (InterruptedException handled) { Logger.getLogger(ThreadUtil.class).error(handled.getMessage(), handled); Thread.currentThread().interrupt(); } finally { pooledExecutor.shutdown(); } } /** Returns a readable name of the current executing thread. */ public static String currentThreadInfo() { Thread thread = Thread.currentThread(); return thread.getName() + "@" + thread.hashCode(); } public static ExecutorService createExecutor(int threadCount, String threadFactoryName) { ThreadFactory tf = new TestNGThreadFactory("method=" + threadFactoryName); return new ThreadPoolExecutor( threadCount, threadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), tf); } }