我已經編寫了這個代碼,使用一個Executor.newFixedThreadPool和一個ConcurrentLinkedQueue併發地構建一個對象集合。但是,我發現這整個線程池和任務提交給它詳細。我希望我可以使用流更簡潔地編寫它。使用java8流建立一個集合
private ConcurrentLinkedQueue<ApiRunner> getRunners(final ApiRunnerBuilder builder,
final int testSize) throws InterruptedException {
final ExecutorService executor = Executors.newFixedThreadPool(NUM_OF_CORES);
ConcurrentLinkedQueue<ApiRunner> runners = new ConcurrentLinkedQueue<ApiRunner>();
for (int i = 0; i < testSize; i++) {
executor.execute(() -> {
runners.add(builder.build());
});
}
executor.shutdown();
executor.awaitTermination(300, TimeUnit.SECONDS);
return runners;
}
我想也許它可以減少到這樣的事情(對Java和新流):
private ConcurrentLinkedQueue<ApiRunner> getRunners(final ApiRunnerBuilder builder,
final int testSize) throws InterruptedException {
ConcurrentLinkedQueue<ApiRunner> runners = new ConcurrentLinkedQueue<ApiRunner>();
ConcurrentLinkedQueue<ApiRunner> runners = range(testSize).parallelStream(()-> {
runners.add(builder.build());
});
}
return runners;
}
對於它的價值:我非常懷疑''parallel()'只會減慢代碼速度,而不會加快速度。 –
值得注意的是,在這個例子中,不需要'ConcurrentLinkedQueue',因爲流實現負責正確的同步。 – Holger
@LouisWasserman這可能是真的,除非''build()''是一個昂貴的操作。 –