Java Code Examples for java.util.concurrent.ThreadPoolExecutor#shutdownNow()

The following examples show how to use java.util.concurrent.ThreadPoolExecutor#shutdownNow() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: GerritHandler.java    From gerrit-events with MIT License 6 votes vote down vote up
/**
 * Closes the handler.
 *
 * @param join if the method should wait for the thread to finish before returning.
 */
public void shutdown(boolean join) {
    ThreadPoolExecutor pool = executor;
    executor = null;
    pool.shutdown(); // Disable new tasks from being submitted
    if (join) {
        try {
            // Wait a while for existing tasks to terminate
            if (!pool.awaitTermination(WAIT_FOR_JOBS_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS)) {
                pool.shutdownNow(); // Cancel currently executing tasks
                // Wait a while for tasks to respond to being cancelled
                if (!pool.awaitTermination(WAIT_FOR_JOBS_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS)) {
                    logger.error("Pool did not terminate");
                }
            }
        } catch (InterruptedException ie) {
            // (Re-)Cancel if current thread also interrupted
            pool.shutdownNow();
            // Preserve interrupt status
            Thread.currentThread().interrupt();
        }
    }
}
 
Example 2
Source File: ThreadPoolExecutorFactory.java    From Jupiter with Apache License 2.0 6 votes vote down vote up
@Override
public CloseableExecutor newExecutor(Target target, String name) {
    final ThreadPoolExecutor executor = new ThreadPoolExecutor(
            coreWorkers(target),
            maxWorkers(target),
            120L,
            TimeUnit.SECONDS,
            workQueue(target),
            threadFactory(name),
            createRejectedPolicy(target, name, new RejectedTaskPolicyWithReport(name, "jupiter")));

    return new CloseableExecutor() {

        @Override
        public void execute(Runnable task) {
            executor.execute(task);
        }

        @Override
        public void shutdown() {
            logger.warn("ThreadPoolExecutorFactory#{} shutdown.", executor);
            executor.shutdownNow();
        }
    };
}
 
Example 3
Source File: GerritSendCommandQueue.java    From gerrit-events with MIT License 6 votes vote down vote up
/**
 * Shuts down the executor(s).
 * Gracefully waits for {@link #WAIT_FOR_JOBS_SHUTDOWN_TIMEOUT} seconds for all jobs to finish
 * before forcefully shutting them down.
 */
public static void shutdown() {
    if (instance != null && instance.executor != null) {
        ThreadPoolExecutor pool = instance.executor;
        instance.executor = null;
        pool.shutdown(); // Disable new tasks from being submitted
        try {
            // Wait a while for existing tasks to terminate
            if (!pool.awaitTermination(WAIT_FOR_JOBS_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS)) {
                pool.shutdownNow(); // Cancel currently executing tasks
                // Wait a while for tasks to respond to being cancelled
                if (!pool.awaitTermination(WAIT_FOR_JOBS_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS)) {
                    logger.error("Pool did not terminate");
                }
            }
        } catch (InterruptedException ie) {
            // (Re-)Cancel if current thread also interrupted
            pool.shutdownNow();
            // Preserve interrupt status
            Thread.currentThread().interrupt();
        }
    }
}
 
Example 4
Source File: PooledExecutionService.java    From ehcache3 with Apache License 2.0 6 votes vote down vote up
private static void destroyPool(String alias, ThreadPoolExecutor executor) {
  List<Runnable> tasks = executor.shutdownNow();
  if (!tasks.isEmpty()) {
    LOGGER.warn("Tasks remaining in pool '{}' at shutdown: {}", alias, tasks);
  }
  boolean interrupted = false;
  try {
    while (true) {
      try {
        if (executor.awaitTermination(30, SECONDS)) {
          return;
        } else {
          LOGGER.warn("Still waiting for termination of pool '{}'", alias);
        }
      } catch (InterruptedException e) {
        interrupted = true;
      }
    }
  } finally {
    if (interrupted) {
      Thread.currentThread().interrupt();
    }
  }
}
 
Example 5
Source File: ThreadPoolFactory.java    From bookmark with MIT License 6 votes vote down vote up
/**
 * Description: 关闭一个连接池,等待已有任务完成
 *
 * @param executor 被关闭线程池对象
 * @return void
 * @author fanxb
 * @date 2018/10/12 13:45
 */
public static void shutdown(ThreadPoolExecutor executor) {
    if (executor == null) {
        return;
    }
    executor.shutdown();
    try {
        int count = 0;
        int timeOut = 2;
        while (executor.awaitTermination(timeOut, TimeUnit.SECONDS)) {
            count++;
            if (count == 100) {
                executor.shutdownNow();
                break;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
 
Example 6
Source File: BackgroundExecutor.java    From jadx with Apache License 2.0 6 votes vote down vote up
private boolean waitTermination(ThreadPoolExecutor executor) throws InterruptedException {
	while (true) {
		if (executor.isTerminated()) {
			return true;
		}
		if (isCancelled()) {
			executor.shutdownNow();
			progressPane.changeLabel(this, task.getTitle() + " (Canceling)… ");
			progressPane.changeIndeterminate(this, true);
			// force termination
			executor.awaitTermination(5, TimeUnit.SECONDS);
			return false;
		}
		setProgress(calcProgress(executor.getCompletedTaskCount()));
		Thread.sleep(500);
	}
}
 
Example 7
Source File: ThreadPoolTestBase.java    From sofa-common-tools with Apache License 2.0 5 votes vote down vote up
@After
@SuppressWarnings("unchecked")
public void clearUp() throws Exception {
    ThreadPoolGovernor.stopSchedule();

    Field f = ThreadPoolGovernor.class.getDeclaredField("registry");
    f.setAccessible(true);
    Map<String, ThreadPoolExecutor> registry = (Map<String, ThreadPoolExecutor>) f.get(null);
    for (ThreadPoolExecutor executor : registry.values()) {
        executor.shutdownNow();
    }
    registry.clear();
}
 
Example 8
Source File: ThreadPoolExecutorTest.java    From j2objc with Apache License 2.0 5 votes vote down vote up
/**
 * shutdownNow returns a list containing tasks that were not run,
 * and those tasks are drained from the queue
 */
public void testShutdownNow() throws InterruptedException {
    final int poolSize = 2;
    final int count = 5;
    final AtomicInteger ran = new AtomicInteger(0);
    final ThreadPoolExecutor p =
        new ThreadPoolExecutor(poolSize, poolSize,
                               LONG_DELAY_MS, MILLISECONDS,
                               new ArrayBlockingQueue<Runnable>(10));
    final CountDownLatch threadsStarted = new CountDownLatch(poolSize);
    Runnable waiter = new CheckedRunnable() { public void realRun() {
        threadsStarted.countDown();
        try {
            MILLISECONDS.sleep(2 * LONG_DELAY_MS);
        } catch (InterruptedException success) {}
        ran.getAndIncrement();
    }};
    for (int i = 0; i < count; i++)
        p.execute(waiter);
    await(threadsStarted);
    assertEquals(poolSize, p.getActiveCount());
    assertEquals(0, p.getCompletedTaskCount());
    final List<Runnable> queuedTasks;
    try {
        queuedTasks = p.shutdownNow();
    } catch (SecurityException ok) {
        return; // Allowed in case test doesn't have privs
    }
    assertTrue(p.isShutdown());
    assertTrue(p.getQueue().isEmpty());
    assertEquals(count - poolSize, queuedTasks.size());
    assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
    assertTrue(p.isTerminated());
    assertEquals(poolSize, ran.get());
    assertEquals(poolSize, p.getCompletedTaskCount());
}
 
Example 9
Source File: QueuedNotificationManagerTest.java    From yangtools with Eclipse Public License 1.0 5 votes vote down vote up
@Test(timeout = 10000)
public void testNotificationsWithListenerJVMError() {

    final CountDownLatch errorCaughtLatch = new CountDownLatch(1);
    queueExecutor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>()) {
        @Override
        @SuppressWarnings("checkstyle:illegalCatch")
        public void execute(final Runnable command) {
            super.execute(() -> {
                try {
                    command.run();
                } catch (Error e) {
                    errorCaughtLatch.countDown();
                }
            });
        }
    };

    NotificationManager<TestListener<Integer>, Integer> manager = QueuedNotificationManager.create(queueExecutor,
            new TestNotifier<>(), 10, "TestMgr");

    TestListener<Integer> listener = new TestListener<>(2, 1);
    listener.jvmError = mock(Error.class);

    manager.submitNotification(listener, 1);

    assertTrue("JVM Error caught", Uninterruptibles.awaitUninterruptibly(errorCaughtLatch, 5, TimeUnit.SECONDS));

    manager.submitNotification(listener, 2);

    listener.verifyNotifications();
    List<Runnable> tasks = queueExecutor.shutdownNow();
    assertTrue(tasks.isEmpty());
}
 
Example 10
Source File: HelloWorldContinuationsThrottleTest.java    From cxf with Apache License 2.0 5 votes vote down vote up
@Test
public void testThrottleContinuations() throws Exception {
    QName serviceName = new QName("http://cxf.apache.org/systest/jaxws", "HelloContinuationService");

    URL wsdlURL = getClass().getClassLoader().getResource(WSDL_PATH);
    HelloContinuationService service = new HelloContinuationService(wsdlURL, serviceName);
    final HelloContinuation helloPort = markForClose(service.getPort(HelloContinuation.class, cff));

    ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS,
                                                         new ArrayBlockingQueue<Runnable>(10));
    CountDownLatch startSignal = new CountDownLatch(1);
    CountDownLatch helloDoneSignal = new CountDownLatch(5);

    executor.execute(new HelloWorker(helloPort, "Fred", "", startSignal, helloDoneSignal));
    startSignal.countDown();

    Thread.sleep(10000);

    executor.execute(new HelloWorker(helloPort, "Barry", "Jameson", startSignal, helloDoneSignal));
    executor.execute(new HelloWorker(helloPort, "Harry", "", startSignal, helloDoneSignal));
    executor.execute(new HelloWorker(helloPort, "Rob", "Davidson", startSignal, helloDoneSignal));
    executor.execute(new HelloWorker(helloPort, "James", "ServiceMix", startSignal, helloDoneSignal));

    helloDoneSignal.await(60, TimeUnit.SECONDS);
    executor.shutdownNow();

    Assert.assertEquals("Some invocations are still running", 0, helloDoneSignal.getCount());
}
 
Example 11
Source File: ConcurrentEngineUsageTest.java    From flowable-engine with Apache License 2.0 5 votes vote down vote up
@Deployment
public void testConcurrentUsage() throws Exception {

    if (!processEngineConfiguration.getDatabaseType().equals("h2") && !processEngineConfiguration.getDatabaseType().equals("db2")) {
        int numberOfThreads = 5;
        int numberOfProcessesPerThread = 5;
        int totalNumberOfTasks = 2 * numberOfThreads * numberOfProcessesPerThread;

        ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(numberOfThreads));

        for (int i = 0; i < numberOfThreads; i++) {
            executor.execute(new ConcurrentProcessRunnerRunnable(numberOfProcessesPerThread, "kermit" + i));
        }

        // Wait for termination or timeout and check if all tasks are complete
        executor.shutdown();
        boolean isEnded = executor.awaitTermination(20000, TimeUnit.MILLISECONDS);
        if (!isEnded) {
            LOGGER.error("Executor was not shut down after timeout, not al tasks have been executed");
            executor.shutdownNow();

        }
        assertEquals(0, executor.getActiveCount());

        // Check there are no processes active anymore
        assertEquals(0, runtimeService.createProcessInstanceQuery().count());

        if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
            // Check if all processes and tasks are complete
            assertEquals(numberOfProcessesPerThread * numberOfThreads, historyService.createHistoricProcessInstanceQuery()
                    .finished().count());
            assertEquals(totalNumberOfTasks, historyService.createHistoricTaskInstanceQuery()
                    .finished().count());
        }
    }
}
 
Example 12
Source File: DiskStoreImpl.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
private void shutdownPool(ThreadPoolExecutor pool) {
// All the regions have already been closed
   // so this pool shouldn't be doing anything.
   List<Runnable> l = pool.shutdownNow();
   for (Runnable runnable : l) {
     if (l instanceof DiskStoreTask) {
       ((DiskStoreTask) l).taskCancelled();
     }
   }
 }
 
Example 13
Source File: ThreadPoolExecutorTest.java    From openjdk-jdk9 with GNU General Public License v2.0 5 votes vote down vote up
/**
 * shutdownNow returns a list containing tasks that were not run,
 * and those tasks are drained from the queue
 */
public void testShutdownNow() throws InterruptedException {
    final int poolSize = 2;
    final int count = 5;
    final AtomicInteger ran = new AtomicInteger(0);
    final ThreadPoolExecutor p =
        new ThreadPoolExecutor(poolSize, poolSize,
                               LONG_DELAY_MS, MILLISECONDS,
                               new ArrayBlockingQueue<Runnable>(10));
    final CountDownLatch threadsStarted = new CountDownLatch(poolSize);
    Runnable waiter = new CheckedRunnable() { public void realRun() {
        threadsStarted.countDown();
        try {
            MILLISECONDS.sleep(2 * LONG_DELAY_MS);
        } catch (InterruptedException success) {}
        ran.getAndIncrement();
    }};
    for (int i = 0; i < count; i++)
        p.execute(waiter);
    await(threadsStarted);
    assertEquals(poolSize, p.getActiveCount());
    assertEquals(0, p.getCompletedTaskCount());
    final List<Runnable> queuedTasks;
    try {
        queuedTasks = p.shutdownNow();
    } catch (SecurityException ok) {
        return; // Allowed in case test doesn't have privs
    }
    assertTrue(p.isShutdown());
    assertTrue(p.getQueue().isEmpty());
    assertEquals(count - poolSize, queuedTasks.size());
    assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
    assertTrue(p.isTerminated());
    assertEquals(poolSize, ran.get());
    assertEquals(poolSize, p.getCompletedTaskCount());
}
 
Example 14
Source File: CompactSplit.java    From hbase with Apache License 2.0 5 votes vote down vote up
private void waitFor(ThreadPoolExecutor t, String name) {
  boolean done = false;
  while (!done) {
    try {
      done = t.awaitTermination(60, TimeUnit.SECONDS);
      LOG.info("Waiting for " + name + " to finish...");
      if (!done) {
        t.shutdownNow();
      }
    } catch (InterruptedException ie) {
      LOG.warn("Interrupted waiting for " + name + " to finish...");
      t.shutdownNow();
    }
  }
}
 
Example 15
Source File: ConcurrentEngineUsageTest.java    From activiti6-boot2 with Apache License 2.0 5 votes vote down vote up
@Deployment
public void testConcurrentUsage() throws Exception {

  if (!processEngineConfiguration.getDatabaseType().equals("h2") && !processEngineConfiguration.getDatabaseType().equals("db2")) {
    int numberOfThreads = 5;
    int numberOfProcessesPerThread = 5;
    int totalNumberOfTasks = 2 * numberOfThreads * numberOfProcessesPerThread;

    ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(numberOfThreads));

    for (int i = 0; i < numberOfThreads; i++) {
      executor.execute(new ConcurrentProcessRunnerRunnable(numberOfProcessesPerThread, "kermit" + i));
    }

    // Wait for termination or timeout and check if all tasks are
    // complete
    executor.shutdown();
    boolean isEnded = executor.awaitTermination(20000, TimeUnit.MILLISECONDS);
    if (!isEnded) {
      log.error("Executor was not shut down after timeout, not al tasks have been executed");
      executor.shutdownNow();

    }
    assertEquals(0, executor.getActiveCount());

    // Check there are no processes active anymore
    assertEquals(0, runtimeService.createProcessInstanceQuery().count());

    if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
      // Check if all processes and tasks are complete
      assertEquals(numberOfProcessesPerThread * numberOfThreads, historyService.createHistoricProcessInstanceQuery().finished().count());
      assertEquals(totalNumberOfTasks, historyService.createHistoricTaskInstanceQuery().finished().count());
    }
  }
}
 
Example 16
Source File: AsyncZuulServlet.java    From s2g-zuul with MIT License 5 votes vote down vote up
private void shutdownPoolExecutor(ThreadPoolExecutor old) {
    try {
        old.awaitTermination(5, TimeUnit.MINUTES);
        old.shutdown();
    } catch (InterruptedException e) {
        old.shutdownNow();
        LOGGER.error("Shutdown Zuul Thread Pool:", e);
    }
}
 
Example 17
Source File: TomcatGracefulShutdown.java    From fast-family-master with Apache License 2.0 5 votes vote down vote up
@Override
public void customize(Connector connector) {
    if (connector == null) {
        log.info("We are running unit test");
        return;
    }
    final Executor executor = connector.getProtocolHandler().getExecutor();
    if (executor instanceof ThreadPoolExecutor) {
        log.info("executor is ThreadPoolExecutor");
        final ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
        if (threadPoolExecutor.isTerminated()) {
            log.info("thread pool executor has terminated");
        } else {
            LocalDateTime startShutdown = LocalDateTime.now();
            LocalDateTime stopShutdown = LocalDateTime.now();

            try {
                threadPoolExecutor.shutdown();
                if (!threadPoolExecutor
                        .awaitTermination(tomcatGracefulShutdownProperties.getWaitTime(), TimeUnit.SECONDS)) {
                    log.warn("Tomcat thread pool did not shut down gracefully within"
                            + tomcatGracefulShutdownProperties.getWaitTime() + " second(s). Proceeding with force shutdown");
                    threadPoolExecutor.shutdownNow();
                } else {
                    log.info("Tomcat thread pool is empty,we stop now");
                }
            } catch (Exception e) {
                log.error("The await termination has been interrupted : " + e.getMessage());
                Thread.currentThread().interrupt();
                ;
            } finally {
                final long seconds = Duration.between(startShutdown, stopShutdown).getSeconds();
                log.info("Shutdown performed in " + seconds + " second(s)");
            }

        }
    }

}
 
Example 18
Source File: PriorityBasedThreadPoolExecutorTest.java    From dr-elephant with Apache License 2.0 4 votes vote down vote up
@Test (timeout = 120000)
public void testPriorityBasedExecutor() throws Exception {
  List<Priority> priorityList = Collections.synchronizedList(new ArrayList<Priority>());
  ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("priority-exec-thread-%d").build();
  ThreadPoolExecutor threadPoolExecutor = new PriorityBasedThreadPoolExecutor(2, 2, 0L,
      TimeUnit.MILLISECONDS, factory);
  Future<?> future1 = threadPoolExecutor.submit(
      RunnableWithPriority.get(new DummyRunnable(priorityList, Priority.LOW), Priority.LOW));
  Future<?> future2 = threadPoolExecutor.submit(
      RunnableWithPriority.get(new DummyRunnable(priorityList, Priority.LOW), Priority.LOW));
  Future<?> future3 = threadPoolExecutor.submit(
      RunnableWithPriority.get(new DummyRunnable(priorityList, Priority.LOW), Priority.LOW));
  Future<?> future4 = threadPoolExecutor.submit(
      RunnableWithPriority.get(new DummyRunnable(priorityList, Priority.LOW), Priority.LOW));
  Future<?> future5 = threadPoolExecutor.submit(
      RunnableWithPriority.get(new DummyRunnable(priorityList, Priority.NORMAL), Priority.NORMAL));
  Future<?> future6 = threadPoolExecutor.submit(
      RunnableWithPriority.get(new DummyRunnable(priorityList, Priority.NORMAL), Priority.NORMAL));
  Future<?> future7 = threadPoolExecutor.submit(
      RunnableWithPriority.get(new DummyRunnable(priorityList, Priority.HIGH), Priority.HIGH));
  Future<?> future8 = threadPoolExecutor.submit(
      RunnableWithPriority.get(new DummyRunnable(priorityList, Priority.HIGH), Priority.HIGH));
  List<Priority> expectedPriorityList = Lists.newArrayList(Priority.LOW, Priority.LOW);
  while (priorityList.size() < 2) {
    Thread.sleep(100);
  }
  Assert.assertEquals(expectedPriorityList, priorityList);
  future1.cancel(true);
  future2.cancel(true);
  expectedPriorityList.addAll(Lists.newArrayList(Priority.HIGH, Priority.HIGH));
  while (priorityList.size() < 4) {
    Thread.sleep(100);
  }
  Assert.assertEquals(expectedPriorityList, priorityList);
  future7.cancel(true);
  future8.cancel(true);
  expectedPriorityList.addAll(Lists.newArrayList(Priority.NORMAL, Priority.NORMAL));
  while (priorityList.size() < 6) {
    Thread.sleep(100);
  }
  Assert.assertEquals(expectedPriorityList, priorityList);
  future5.cancel(true);
  future6.cancel(true);
  expectedPriorityList.addAll(Lists.newArrayList(Priority.LOW, Priority.LOW));
  while (priorityList.size() < 8) {
    Thread.sleep(100);
  }
  Assert.assertEquals(expectedPriorityList, priorityList);
  future3.cancel(true);
  future4.cancel(true);
  threadPoolExecutor.shutdownNow();
}
 
Example 19
Source File: ArchiveTest.java    From aeron with Apache License 2.0 4 votes vote down vote up
@Test
public void shouldAllowMultipleConnectionsInParallel() throws InterruptedException
{
    final int numberOfArchiveClients = 5;
    final long connectTimeoutNs = TimeUnit.SECONDS.toNanos(10);
    final CountDownLatch latch = new CountDownLatch(numberOfArchiveClients);
    final ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newFixedThreadPool(numberOfArchiveClients);
    final ManyToOneConcurrentLinkedQueue<AeronArchive> archiveClientQueue = new ManyToOneConcurrentLinkedQueue<>();
    final MediaDriver.Context driverCtx = new MediaDriver.Context()
        .errorHandler(Tests::onError)
        .clientLivenessTimeoutNs(connectTimeoutNs)
        .dirDeleteOnStart(true)
        .publicationUnblockTimeoutNs(connectTimeoutNs * 2)
        .threadingMode(ThreadingMode.SHARED);
    final Context archiveCtx = new Context()
        .threadingMode(SHARED)
        .connectTimeoutNs(connectTimeoutNs);
    executor.prestartAllCoreThreads();

    try (ArchivingMediaDriver driver = ArchivingMediaDriver.launch(driverCtx, archiveCtx))
    {
        for (int i = 0; i < numberOfArchiveClients; i++)
        {
            executor.execute(
                () ->
                {
                    final AeronArchive.Context ctx = new AeronArchive.Context().messageTimeoutNs(connectTimeoutNs);
                    final AeronArchive archive = AeronArchive.connect(ctx);
                    archiveClientQueue.add(archive);
                    latch.countDown();
                });
        }

        latch.await(driver.archive().context().connectTimeoutNs() * 2, TimeUnit.NANOSECONDS);

        AeronArchive archiveClient;
        while (null != (archiveClient = archiveClientQueue.poll()))
        {
            archiveClient.close();
        }

        assertEquals(0L, latch.getCount());
    }
    finally
    {
        executor.shutdownNow();
        archiveCtx.deleteDirectory();
        driverCtx.deleteDirectory();
    }
}
 
Example 20
Source File: AbstractHttpServiceComponent2.java    From uavstack with Apache License 2.0 3 votes vote down vote up
@Override
public void start(Executor executor, int port, int backlog, boolean forceExit) {

    if (!ThreadPoolExecutor.class.isAssignableFrom(executor.getClass())) {
        throw new RuntimeException("No Supportive Executor Exception: only support ThreadPoolExecutor");
    }

    ThreadPoolExecutor tpe = (ThreadPoolExecutor) executor;

    start(port, backlog, Runtime.getRuntime().availableProcessors() * 2, tpe.getCorePoolSize(), forceExit);

    tpe.shutdownNow();
}