Tôi đã nhìn xung quanh nhưng chưa tìm thấy câu trả lời nên tôi muốn xác nhận điều này một cách chắc chắn.Java Thread Pools/Executor Service và wait() s - điều gì sẽ xảy ra với chuỗi chủ đề và nhiệm vụ?
Nói rằng tôi có một cố định kích thước hồ bơi thread - ExecutorService pool = Executors.newFixedThreadPool(5);
Và tôi có một số mã:
pool.execute(new Runnable(){
try{
Object waitForMe = doSomethingAndGetObjectToWaitFor();
waitForMe.wait();
doSomethingElse();
}catch(Exception e){ throw new RunTimeException(e) }
});
phép giả định rằng các mã trên được gọi là một vài 100 lần. Chỉ có 5 chủ đề trong hồ bơi (vì vậy chỉ có 5 câu trên được phát hành tại một thời điểm). Cũng giả sử rằng wait()
là trên một đối tượng đang thực hiện một số cuộc gọi I/O tới một bên thối và chờ đợi một cuộc gọi lại khi thao tác hoàn tất, do đó sẽ mất một lúc để hoàn thành một cách tự nhiên.
Bây giờ câu hỏi của tôi là hành vi khi một trong các tác vụ này đạt đến một wait()
, tác vụ có chuyển sang chế độ ngủ hay không và sau đó chuỗi từ nhóm chủ đề lấy một hàng đợi khác và bắt đầu chạy nó?
Nếu tác vụ đang chờ chuyển sang chế độ ngủ, điều gì sẽ xảy ra khi điện thoại nhận được số notify()
và đánh thức? Chủ đề có quay trở lại hàng đợi (ở mặt trước hoặc sau) cho nhóm chủ đề và đợi cho đến khi một trong 5 chủ đề có thể tiếp tục thực hiện nó (tức là gọi doSomethingelse()
) không? Hoặc hiện các chủ đề được thực hiện nó cũng đi ngủ nghĩa là một trong 5 chủ đề thi hành ngồi chờ đợi với nhiệm vụ (đây là những gì tôi giả định)? Hoặc không thực hiện các chủ đề nhận một nhiệm vụ khác và chỉ đơn giản là bị gián đoạn khi nhiệm vụ đầu tiên trở về từ wait()?
Cảm ơn câu trả lời tuyệt vời! Với tùy chọn gọi lại, những gì sẽ là cách tốt nhất để đi về thiết lập một thời gian chờ (nói muốn chờ đợi x giây cho một cuộc gọi lại nếu không có gì ném một lỗi). Cách duy nhất tôi có thể nghĩ là ghi lại các hệ thống hiện thời và giữ nó trong danh sách và có một luồng khác theo dõi danh sách các cuộc gọi đã vượt quá thời gian hiện tại và kích hoạt một lỗi. Tôi cần phải tìm một cuốn sách tốt mà đề với concurrency, callbacks vv Cảm ơn một lần nữa! – NightWolf
@NightWolf: wrt to timeouts xem câu trả lời cập nhật của tôi. Khi nói đến một cuốn sách hay, [Java Concurrency in Practice] (http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601) là điều bắt buộc. –
Cảm ơn heaps cho bản cập nhật và liên kết sách, ý tưởng hay. Đáng buồn là tôi không có quyền kiểm soát bên thứ ba. – NightWolf