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}