У нас есть метод GetDataParallel(), который может быть вызван многими клиентами в настоящее время, и мы используем ExecutorService для вызова MyCallable внутри него. Однако я обнаружил, что не вызвал бы execorService.shutdown(); приложение никогда не выходит, поэтому почему приложение не может выйти, мы должны закрыть все потоки пула потоков вручную до выхода приложения? и в среде обслуживания я думаю, что нам не нужно вызывать executorService.shutdown(); чтобы поддерживать приложение, верно?Когда исполнительService.shutdown(); следует называть
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreading {
static ExecutorService executorService = Executors.newFixedThreadPool(100);
private List<String> _BusinessUnits= new ArrayList<String>();
public static void main(String[] args) throws Exception {
MultiThreading kl =new MultiThreading();
kl.GetDataParallel();
Thread.sleep(10000);
System.out.println("111111111");
//executorService.shutdown();
}
public void GetDataParallel() throws Exception
{
_BusinessUnits.add("BU1");
_BusinessUnits.add("BU2");
_BusinessUnits.add("BU3");
for(final String v : _BusinessUnits)
{
ExecutorServiceTest.executorService.submit(new MyCallable());
}
}
}
class MyCallable implements Callable {
@Override
public String call() throws Exception {
Thread.sleep(1000);
//return the thread name executing this callable task
System.out.println(Thread.currentThread().getName());
return Thread.currentThread().getName();
}
}
Executor нити не демон нити и поэтому JVM не прекращается, пока они работают. Вы должны закрыть их вручную. http://stackoverflow.com/questions/2213340/what-is-daemon-thread-in-java Я предполагаю, что вы можете использовать пользовательский ThreadFactory, который обеспечивал потоки демона, но выключение намного проще и чище и безопаснее, особенно если вы делаете io в своих задачах. –
@Jason C, что значит «во время работы»? run означает поток, выполняющий код, или они просто остаются в пуле потоков? Вы знаете, что закончившийся поток запускает вызываемый через 1 секунду, поэтому он не должен находиться в рабочем состоянии через 1 секунду, однако приложение по-прежнему не выходило через много раз. – Jason
Если они активны, в пуле потоков. Не обязательно выполнение задач. Например. потоки в фиксированном пуле потоков всегда работают, даже если очередь пуста. Потоки в кэшированном пуле потоков в конечном итоге будут простаивать и умирать, если нет задач. Вызов завершения работы приведет к прекращению потоков. –