Tôi chủ yếu đồng ý với câu trả lời của Dave, nhưng nếu bạn cần cắt thời gian CPU trên tất cả các nhóm, nghĩa là tất cả các nhóm nhiệm vụ sẽ tiến hành song song, bạn có thể tìm loại cấu trúc hữu ích (. sử dụng loại bỏ như "khóa" này làm việc tốt trong trường hợp của tôi mặc dù tôi tưởng tượng nó có xu hướng sử dụng nhiều bộ nhớ hơn):
class TaskAllocator {
private final ConcurrentLinkedQueue<Queue<Runnable>> entireWork
= childQueuePerTaskGroup();
public Queue<Runnable> lockTaskGroup(){
return entireWork.poll();
}
public void release(Queue<Runnable> taskGroup){
entireWork.offer(taskGroup);
}
}
và
class DoWork implmements Runnable {
private final TaskAllocator allocator;
public DoWork(TaskAllocator allocator){
this.allocator = allocator;
}
pubic void run(){
for(;;){
Queue<Runnable> taskGroup = allocator.lockTaskGroup();
if(task==null){
//No more work
return;
}
Runnable work = taskGroup.poll();
if(work == null){
//This group is done
continue;
}
//Do work, but never forget to release the group to
// the allocator.
try {
work.run();
} finally {
allocator.release(taskGroup);
}
}//for
}
}
Bạn có thể sau đó sử dụng số lượng chủ đề tối ưu để chạy DoWork
bài tập. Đó là loại cân bằng tải round robin ..
Bạn thậm chí có thể làm điều gì đó phức tạp hơn, bằng cách sử dụng này thay vì một hàng đợi đơn giản trong TaskAllocator
(nhóm nhiệm vụ với nhiều nhiệm vụ còn lại có xu hướng để thực hiện)
ConcurrentSkipListSet<MyQueue<Runnable>> sophisticatedQueue =
new ConcurrentSkipListSet(new SophisticatedComparator());
nơi SophisticatedComparator
là
class SophisticatedComparator implements Comparator<MyQueue<Runnable>> {
public int compare(MyQueue<Runnable> o1, MyQueue<Runnable> o2){
int diff = o2.size() - o1.size();
if(diff==0){
//This is crucial. You must assign unique ids to your
//Subqueue and break the equality if they happen to have same size.
//Otherwise your queues will disappear...
return o1.id - o2.id;
}
return diff;
}
}
Nguồn
2010-07-15 08:48:14
"Tuy nhiên, chủ đề sẽ chặn lẫn nhau và thông không được tối đa hóa.". Bạn có nghĩa là các nhiệm vụ cá nhân đang truy cập vào một cấu trúc dữ liệu được chia sẻ hoặc tài nguyên và đây là nguyên nhân gây tranh cãi? – Adamski
Bạn có biết trước tất cả các nhiệm vụ của một nhóm không? Điều này là quan trọng khi lựa chọn một giải pháp (hàng đợi vs không có hàng đợi) –