21 package org.matsim.core.mobsim.qsim.qnetsimengine;
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.concurrent.ExecutionException;
26 import java.util.concurrent.ExecutorService;
27 import java.util.concurrent.Executors;
28 import java.util.concurrent.Future;
29 import java.util.concurrent.ThreadFactory;
31 import jakarta.inject.Inject;
46 final class QNetsimEngineWithThreadpool
extends AbstractQNetsimEngine<QNetsimEngineRunnerForThreadpool> {
48 private final int numOfRunners;
49 private ExecutorService pool;
55 @Inject QNetsimEngineWithThreadpool(
final QSim sim, QNetworkFactory netsimNetworkFactory, NetworkModeDepartureHandler networkModeDepartureHandler) {
56 super(sim, netsimNetworkFactory, networkModeDepartureHandler);
57 this.numOfRunners = this.numOfThreads;
60 @Override
public void finishMultiThreading() {
64 protected void run(
double time) {
96 ((QNetsimEngineRunnerForThreadpool) engine).setMovingNodes(
true);
98 for (Future<Boolean> future : pool.invokeAll(
this.getQnetsimEngineRunner())) {
102 ((QNetsimEngineRunnerForThreadpool) engine).setMovingNodes(
false);
104 for (Future<Boolean> future : pool.invokeAll(
this.getQnetsimEngineRunner())) {
107 }
catch (InterruptedException e) {
109 }
catch (ExecutionException e) {
119 return new Thread( r ,
"QNetsimEngine_PooledThread_" + count++);
124 protected List<QNetsimEngineRunnerForThreadpool> initQSimEngineRunners() {
125 List<QNetsimEngineRunnerForThreadpool> engines =
new ArrayList<>();
126 for (
int i = 0; i < numOfRunners; i++) {
127 QNetsimEngineRunnerForThreadpool engine =
new QNetsimEngineRunnerForThreadpool();
134 protected void initMultiThreading() {
135 this.pool = Executors.newFixedThreadPool(
Thread newThread(Runnable r)