Tôi đang vật lộn với cách tốt nhất để triển khai đường ống xử lý của mình.hàng đợi của nhà sản xuất/người tiêu dùng
Nhà sản xuất thức ăn chăn nuôi của tôi hoạt động với BlockingQueue. Về phía người tiêu dùng, tôi thăm dò ý kiến hàng đợi, bọc những gì tôi nhận được trong một nhiệm vụ Runnable, và gửi nó đến một ExecutorService.
while (!isStopping())
{
String work = workQueue.poll(1000L, TimeUnit.MILLISECONDS);
if (work == null)
{
break;
}
executorService.execute(new Worker(work)); // needs to block if no threads!
}
Điều này không lý tưởng; ExecutorService có hàng đợi riêng của mình, tất nhiên, vì vậy những gì thực sự xảy ra là tôi luôn hoàn toàn thoát khỏi hàng đợi công việc của mình và điền vào hàng đợi nhiệm vụ, từ đó làm trống khi các tác vụ hoàn tất.
Tôi nhận ra rằng tôi có thể xếp hàng nhiệm vụ ở cuối nhà sản xuất, nhưng tôi thực sự không muốn làm điều đó - Tôi thích sự gián đoạn/cô lập hàng đợi công việc của tôi là những chuỗi câm; nó thực sự không phải là kinh doanh của nhà sản xuất những gì sẽ xảy ra với họ. Buộc nhà sản xuất xếp hàng một Runnable hoặc Callable phá vỡ một trừu tượng, IMHO.
Nhưng tôi muốn hàng đợi công việc được chia sẻ đại diện cho trạng thái xử lý hiện tại. Tôi muốn có thể chặn các nhà sản xuất nếu người tiêu dùng không theo kịp.
Tôi rất muốn sử dụng Executors, nhưng tôi cảm thấy mình đang chiến đấu với thiết kế của họ. Tôi có thể uống Kool-ade một phần không, hoặc tôi có phải uống nó không? Tôi có bị sai lầm trong việc chống lại các nhiệm vụ xếp hàng không? (Tôi nghi ngờ tôi có thể thiết lập ThreadPoolExecutor để sử dụng hàng đợi 1 nhiệm vụ và ghi đè phương thức thực thi của nó để chặn thay vì từ chối-trên-hàng đợi đầy đủ, nhưng điều đó cảm thấy tổng.)
Gợi ý?
Cảm ơn; triển khai trước đây của tôi rất giống như thế này, mặc dù nó chỉ sử dụng ThreadFactory - một khi bạn giảm nó thành một tập hợp cố định các luồng mà tất cả cố gắng thoát khỏi hàng đợi công việc, có ít điểm trong việc sử dụng ExecutorService nữa. Tôi đã chuyển sang ExecutorService để tận dụng lợi thế của một nhóm luồng có thể điều chỉnh được nhiều hơn, với ngữ nghĩa "tìm chuỗi công nhân hiện có nếu có, tạo một cái nếu cần thiết, giết chúng nếu chúng không hoạt động." –
Executors.newCachedThreadPool() sẽ làm một cái gì đó tương tự như vậy. Bạn cũng có thể thực sự tinh chỉnh chính sách nhóm trên chính ThreadPoolExecutor. Bạn đang làm gì sau đó? – Kevin
Đó là ý tưởng ... nó có thể được điều chỉnh chính xác theo cách tôi thích, nếu tôi sẵn sàng sử dụng hàng đợi công việc nhiệm vụ của nó. Những gì tôi thực sự muốn là để khắc ra các hồ bơi smarts hồ bơi từ các nhà điều hành và thực hiện riêng của khách hàng hồ bơi thread của tôi, nhưng nó không thực sự thiết lập cho điều đó. –