Đoạn mã sau đây cố gắng đồng bộ hóa điều này.Tắt các chủ đề và người thi hành duyên dáng
Mã lặp mãi mãi và kiểm tra xem có bất kỳ yêu cầu đang chờ xử lý nào không. Nếu có, nó tạo ra một luồng mới để xử lý yêu cầu và gửi nó đến người thực thi. Một khi tất cả các chủ đề được thực hiện, nó ngủ trong 60 giây và một lần nữa kiểm tra các yêu cầu đang chờ xử lý.
public static void main(String a[]){
//variables init code omitted
ExecutorService service = Executors.newFixedThreadPool(15);
ExecutorCompletionService<Long> comp = new ExecutorCompletionService<Long>(service);
while(true){
List<AppRequest> pending = service.findPendingRequests();
int noPending = pending.size();
if (noPending > 0) {
for (AppRequest req : pending) {
Callable<Long> worker = new RequestThread(something, req);
comp.submit(worker);
}
}
for (int i = 0; i < noPending; i++) {
try {
Future<Long> f = comp.take();
long name;
try {
name = f.get();
LOGGER.debug(name + " got completed");
} catch (ExecutionException e) {
LOGGER.error(e.toString());
}
} catch (InterruptedException e) {
LOGGER.error(e.toString());
}
}
TimeUnit.SECONDS.sleep(60);
}
}
Câu hỏi của tôi là hầu hết các quá trình xử lý được thực hiện bởi các chủ đề này liên quan đến cơ sở dữ liệu. Và chương trình này sẽ chạy trên một cửa sổ máy. Điều gì sẽ xảy ra với các chủ đề này khi ai đó cố gắng tắt máy hoặc đăng xuất máy. Làm thế nào để gracefully tắt các chủ đề đang chạy và cũng là người thi hành.
Đây là số lùi. Giả sử 'ExecutorService' là một trong những giá trị điển hình được trả về bởi các phương thức factory' Executors', các chủ đề sao lưu là các chuỗi không phải daemon. Móc tắt sẽ không được gọi cho đến khi các luồng đó thoát ra và điều đó sẽ không xảy ra cho đến khi 'ExecutorService' bị tắt. Giải pháp của bạn sẽ chỉ khi các chủ đề của người thực thi không phải là daemon hoặc nếu chương trình của bạn nhận được một người dùng bị gián đoạn. –
OP yêu cầu cụ thể về trường hợp JVM được yêu cầu thực hiện tắt máy theo thứ tự. Bất kể, nội dung của câu trả lời là chính xác, một trong những chỉ cần không làm điều này trong một cái móc tắt để chấm dứt dịch vụ thi hành trước đó. –
Cảm ơn bạn đã trả lời quá nhanh.Tôi đoán tôi đã bỏ lỡ một phần câu hỏi của họ. Bạn có thể thêm một '' 'thứ ba để làm rõ bit đó không? –