我正在创建一个需要多个进程并行运行的应用程序。要运行的进程数是动态的,这取决于收到的输入。
例如,如果用户想要关于三种不同的东西[汽车,自行车,汽车]的信息,那么我需要三个独立的线程来并行运行。
numberOfThreadsNeeded = getNumberOfThingsFromInput();
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreadsNeeded);
代码段:
public class ConsoleController {
private static final Log LOG = LogFactory.getLog(ConsoleController.class);
@Autowired
ConsoleCache consoleCache;
Metrics metrics;
public List<Feature> getConsoleData(List<String> featureIds, Map<String, Object> input, Metrics metrics) {
this.metrics = metrics;
List<FeatureModel> featureModels =
featureIds
.stream()
.map(consoleCache::getFeature)
.collect(toList());
Integer numberOfThreadsNeeded = getThreadCount(featureModels);
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreadsNeeded);
featureModels.stream()
.map(f -> (Callable<Result>) () -> f.fetchData(input, metrics))
.map(executor::submit)
.collect(toList()));
要创建的线程数从1到100不等。在初始化期间定义thread pool
大小是否安全?
而且我想知道在threads
中运行100 parallel
是否安全?
答案 0 :(得分:0)
根据Java没有硬限制,但可能存在限制,例如,在JVM实现或操作系统中。所以,实际上说有一个限制。有一点,添加更多线程会使性能变差,而不是更好。此外,内存可能会耗尽。
使用ExecutorService的方式与预期的方式不同。通常,您将创建一个ExecutorService,其中包含最适合您环境的线程限制数。
请记住,即使您确实希望并行执行所有任务,但考虑到硬件/软件并发限制,您将无法实现它。
顺便说一句,如果您仍然希望为每个请求创建一个ExecutorService - 请不要忘记调用其shutdown()方法,否则JVM将无法正常退出,因为仍会有线程停留。