(Đây là một nỗ lực để tái tạo trước đó, câu trả lời đã xóa Thilo với điều chỉnh của riêng tôi.)
Tôi nghĩ rằng bạn có thể cần phải làm rõ câu hỏi của bạn vì có một tình trạng vô hạn tiềm ẩn ... tại một số điểm bạn có để quyết định ngừng hoạt động của bạn, và vào thời điểm đó nó sẽ không chấp nhận bất kỳ nhiệm vụ nào nữa. Câu hỏi của bạn dường như ngụ ý rằng bạn muốn đợi cho đến khi bạn biết rằng sẽ không có tác vụ nào khác được gửi, mà bạn chỉ có thể biết trong mã ứng dụng của riêng bạn.
Câu trả lời sau đây sẽ cho phép bạn chuyển đổi thuận lợi sang TPE mới (vì bất kỳ lý do gì), hoàn thành tất cả các nhiệm vụ hiện đang được gửi và không từ chối nhiệm vụ mới cho TPE mới. Nó có thể trả lời câu hỏi của bạn. @ Thilo cũng có thể.
Giả sử bạn đã xác định ở đâu đó một TPE có thể nhìn thấy được sử dụng như vậy:
AtomicReference<ThreadPoolExecutor> publiclyAvailableTPE = ...;
Sau đó bạn có thể viết các thói quen TPE hoán đổi như vậy. Nó cũng có thể được viết bằng một phương pháp đồng bộ, nhưng tôi nghĩ rằng đây là đơn giản:
void rotateTPE()
{
ThreadPoolExecutor newTPE = createNewTPE();
// atomic swap with publicly-visible TPE
ThreadPoolExecutor oldTPE = publiclyAvailableTPE.getAndSet(newTPE);
oldTPE.shutdown();
// and if you want this method to block awaiting completion of old tasks in
// the previously visible TPE
oldTPE.awaitTermination();
}
Ngoài ra, nếu bạn thực sự không đùa muốn giết các hồ bơi thread, sau đó bên nộp bạn sẽ cần phải đối phó với nhiệm vụ từ chối tại một lúc nào đó, và bạn có thể sử dụng null
cho TPE mới:
void killTPE()
{
ThreadPoolExecutor oldTPE = publiclyAvailableTPE.getAndSet(null);
oldTPE.shutdown();
// and if you want this method to block awaiting completion of old tasks in
// the previously visible TPE
oldTPE.awaitTermination();
}
Mà có thể gây ra vấn đề thượng nguồn, người gọi sẽ cần phải biết phải làm gì với một null
.
Bạn cũng có thể hoán đổi với một TPE giả mà chỉ đơn giản từ chối mọi thực thi mới, nhưng điều đó tương đương với những gì xảy ra nếu bạn gọi shutdown()
trên TPE.
Nếu bạn đồng ý với các tác vụ mới đang được thêm vào, điều gì xảy ra nếu nó không bao giờ kết thúc? – Kylar
Tôi nghĩ rằng littleFluffyKitty chỉ muốn chờ đợi cho các nhiệm vụ "cũ" để kết thúc. – Thilo
Tôi không quá quan tâm đến khả năng nó sẽ không bao giờ kết thúc bởi vì nếu đó là trường hợp, sau đó cái gì khác đã bị phá vỡ khủng khiếp. Nếu mọi thứ khác thất bại tôi có thể thực hiện một thời gian ra khỏi một số loại nhưng tôi ok với chỉ giả định nó sẽ kết thúc. Tôi muốn nó có thể thực hiện các nhiệm vụ mới trong khi chờ đợi, hoặc nói theo cách khác, tôi muốn các nhiệm vụ mới có thể được thêm vào sau khi chờ đợi được gọi. – cottonBallPaws