1336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustpackage org.testng.internal.thread; 2336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 3336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 4572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beustimport java.util.List; 5336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.concurrent.LinkedBlockingQueue; 6336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.concurrent.ThreadFactory; 7336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.concurrent.ThreadPoolExecutor; 8336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.concurrent.TimeUnit; 9336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 10336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust/** 1192cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm * An implementation for <code>IExecutor</code> based on <code>ThreadPoolExecutor</code> 12336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * 1392cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm * @author <a href="mailto:the_mindstorm@evolva.ro>Alexandru Popescu</a> 14336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 15336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustpublic class ExecutorAdapter extends ThreadPoolExecutor implements IExecutor { 166ca1e0a167fb4ef9631a03d09b6967e866714508Cédric Beust private IThreadFactory m_threadFactory; 176ca1e0a167fb4ef9631a03d09b6967e866714508Cédric Beust 186ca1e0a167fb4ef9631a03d09b6967e866714508Cédric Beust public ExecutorAdapter(int threadCount, IThreadFactory tf) { 19336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust super(threadCount, 20336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust threadCount, 21336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 0L, 22336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust TimeUnit.MILLISECONDS, 23336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust new LinkedBlockingQueue<Runnable>(), 24336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust (ThreadFactory) tf.getThreadFactory()); 25572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust m_threadFactory = tf; 26336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 27336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 280f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin @Override 290f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin public IFutureResult submitRunnable(final Runnable runnable) { 30336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust return new FutureResultAdapter(super.submit(runnable)); 31336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 32336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 330f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin @Override 340f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin public void stopNow() { 35336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust super.shutdownNow(); 36336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 37336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 380f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin @Override 390f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin public boolean awaitTermination(long timeout) { 4092cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm boolean result= false; 4192cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm try { 4292cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm result= super.awaitTermination(timeout, TimeUnit.MILLISECONDS); 4392cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm } 440e6ecd38a3480ebd71eff3603128fdf7757ca755Cédric Beust catch(InterruptedException handled) { 4592cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm System.out.println("[WARN] ThreadPoolExecutor has been interrupted while awaiting termination"); 4692cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm Thread.currentThread().interrupt(); 4792cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm } 480f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin 4992cf239a58c9337f3e32088fc64dc43cac903558the.mindstorm return result; 50336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 51572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust 520f7e671c94aeedee2fbc796b3318d44b0297b6cdnullin @Override 53572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust public StackTraceElement[][] getStackTraces() { 54572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust List<Thread> threads = m_threadFactory.getThreads(); 55572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust int threadCount = threads.size(); 56572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust StackTraceElement[][] result = new StackTraceElement[threadCount][]; 57572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust for (int i = 0; i < result.length; i++) { 58572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust result[i] = threads.get(i).getStackTrace(); 59572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust } 60572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust return result; 61572c7e6ad1da0add238e4c2cf18f761171653274Cédric Beust } 62336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust}