Tôi đang cố gắng hiểu cách Java FixedThreadPool hoạt động trong thực tế, nhưng các tài liệu không trả lời câu hỏi của tôi.Hiểu Java FixedThreadPool
Giả sử một kịch bản đơn giản như:
ExecutorService ES= Executors.newFixedThreadPool(3);
List<Future> FL;
for(int i=1;i<=200;i++){
FL.add(ES.submit(new Task()));
}
ES.shutdown();
nơi Task
là một Callable
đó xây dựng một số tài nguyên, sử dụng chúng, và trả về một số đầu ra.
Câu hỏi của tôi: số lượng Task
có trong bộ nhớ khi hoàn thành vòng lặp for
không? Nói cách khác: sẽ chỉ có 3 Task
tại một thời điểm xây dựng nguồn lực của họ, hoặc tất cả chúng được tạo trước, như vậy, sau .submit
Tôi có 200 Task
(và tài nguyên của họ) đang chờ để thực thi?
Lưu ý: việc xây dựng tài nguyên diễn ra trong hàm tạo Task
, không theo phương thức call()
.
Trong javadoc (cảm thấy tự do để bỏ qua sau): những gì confuses me là lời giải thích sau đây trong các tài liệu Java
Tạo ra một hồ bơi thread mà tái sử dụng một số cố định của chủ đề hoạt động ra một hàng đợi không được chia sẻ được chia sẻ. Tại bất kỳ thời điểm nào, tại hầu hết các chủ đề nThreads sẽ là các nhiệm vụ xử lý hoạt động.
Tôi cho rằng điều này có nghĩa là, trong ví dụ của tôi, tất cả 200 Tác vụ nằm trong hàng đợi, nhưng chỉ có 3 trong số đó được thực thi bất kỳ lúc nào.
Mọi trợ giúp đều được đánh giá cao.
Bạn ngay sau vòng lặp bạn có 200 trường hợp được tạo của 'Task' trong hàng đợi của nhóm, thực thi 3 tác vụ cùng một lúc. – alex2410
Câu hỏi của bạn không thể trả lời được, bởi vì điều này phụ thuộc rất lớn vào thời điểm và khi nào người thu gom rác đá vào để thu thập các công việc đã hoàn thành. – SpaceTrucker
fyi 'newFixedThreadPool (nThreads)' chỉ là phương thức convience cho 'new ThreadPoolExecutor (nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());' –
for3st