2013-07-31 25 views
6

Có một lớp Java ví dụ rằng:Java có hồ bơi chủ đề nhiều hàng có thể lập chỉ mục không?

  1. nhiệm vụ thực thi có thể được thêm vào thông qua một id, nơi mà tất cả các công việc với cùng id được đảm bảo để không bao giờ chạy đồng thời
  2. Số chủ đề có thể được giới hạn trong một số tiền cố định

Một giải pháp ngây thơ của Bản đồ sẽ dễ dàng giải quyết (1), nhưng sẽ khó quản lý (2). Tương tự, tất cả các lớp gộp nhóm mà tôi biết sẽ kéo từ một hàng đợi duy nhất, có nghĩa là (1) không được đảm bảo.

Các giải pháp liên quan đến thư viện bên ngoài được hoan nghênh.

+0

bạn đã thử những gì>? – Makky

+0

@Makky, tôi đã xem xét cụ thể về Spring TaskExecutor – 00500005

+2

@downvoters, tại sao đây lại là một câu hỏi tồi? Đây không phải là một câu hỏi "plz cho tôi teh mã", và dường như với tôi rằng nó sẽ là một trường hợp sử dụng khá phổ biến cho đa luồng, và googling không mang lại bất kỳ kết quả rõ ràng – 00500005

Trả lời

3

Nếu bạn không tìm thấy thứ gì đó thực hiện điều này, bạn không nên tự cuộn. Một điều bạn có thể làm là để quấn mỗi công việc trong một lớp học đơn giản mà đọc trên một hàng đợi duy nhất trên mỗi id, ví dụ .:

public static class SerialCaller<T> implements Callable<T> { 
    private final BlockingQueue<Caller<T>> delegates; 

    public SerialCaller(BLockingQueue<Caller<T>> delegates) { 
     this.delegates = delegates; 
    } 

    public T call() throws Exception { 
     return delegates.take().call(); 
    } 
} 

Nó phải là dễ dàng để duy trì một bản đồ của id để hàng đợi để nộp nhiệm vụ. Điều kiện thỏa mãn (1), và sau đó bạn có thể tìm các giải pháp đơn giản cho điều kiện (2), chẳng hạn như Executors. newFixedThreadPool

+0

Đề xuất ban đầu của bạn dường như nhẹ hơn và dễ dàng hơn để thực hiện - có lý do gì để thay đổi không? – assylias

+1

@assylias Tôi nhận ra đó có thể là một nút cổ chai lớn. Hãy nói rằng thread thread của bạn cũng bị giới hạn trong N threads, và bạn đã có N nhiệm vụ theo id A, cũng như một số dưới id B và C. Bởi một sự trùng hợp ngẫu nhiên, tất cả các nhiệm vụ của A được lên kế hoạch. Điều đó có nghĩa là các chủ đề N-1 bị chặn - và không thực hiện các nhiệm vụ cho B hoặc C. – yshavit

+0

bạn có thể vui lòng hoàn thành câu trả lời này bằng cách thêm mã nguồn về các ID bản đồ vào hàng đợi và gửi và bỏ phiếu? – Mojtabye

2

Tôi nghĩ rằng giải pháp đơn giản nhất là chỉ có một hàng đợi riêng biệt cho mỗi chỉ mục và một người thực hiện riêng biệt (với một chuỗi) cho mỗi hàng đợi.

Điều duy nhất bạn có thể đạt được với giải pháp phức tạp hơn là sử dụng ít chuỗi hơn, nhưng nếu số lượng chỉ mục nhỏ và bị ràng buộc thì có lẽ không đáng để nỗ lực.

2

Đối với mỗi id, bạn cần một SerialExecutor, được mô tả trong tài liệu của java.util.concurrent.Executor. Tất cả các nhà thực thi nối tiếp ủy nhiệm công việc cho một số ThreadPoolExecutor với corePoolSize đã cho.

Phiên bản Opimized của SerialExecutor có thể được tìm thấy tại my code samples.

+0

Đây là một viên ngọc ẩn trong tài liệu Java! SerialExecutor thực hiện một cách hiệu quả một hồ bơi đa luồng, nhưng chúng không thực sự làm rõ điều đó. – blueimpb

Các vấn đề liên quan