Tôi đang triển khai quickstort parellel như thực hành lập trình và sau khi hoàn thành, tôi đọc trang hướng dẫn Java về Executors, có vẻ như chúng có thể làm cho mã của tôi nhanh hơn nữa. Thật không may, tôi đã dựa vào tham gia() để đảm bảo rằng chương trình không tiếp tục cho đến khi mọi thứ được sắp xếp. Ngay bây giờ tôi đang sử dụng:Đợi tất cả các chủ đề trong một Executor để kết thúc?
public static void quicksort(double[] a, int left, int right) {
if (right <= left) return;
int i = partition(a, left, right);
// threads is an AtomicInteger I'm using to make sure I don't
// spawn a billion threads.
if(threads.get() < 5){
// ThreadSort's run method just calls quicksort()
Future leftThread = e.submit(new ThreadSort(a, left, i-1));
Future rightThread = e.submit(new ThreadSort(a, i+1, right));
threads.getAndAdd(2);
try {
leftThread.get();
rightThread.get();
}
catch (InterruptedException ex) {}
catch (ExecutionException ex) {}
}
else{
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
}
Điều này dường như làm việc ok, nhưng nếu tôi chạy e.shutdown() ngay sau khi tôi gọi phương pháp của tôi quicksort không đệ quy(), nó có một loạt các RejectedExecutionExceptions, vì vậy Tôi cho rằng điều này không hiệu quả như tôi mong muốn.
Vì vậy, dù sao, tôi về cơ bản cố gắng để có được những chức năng tương tự như leftThread.join() nhưng với một Executor, và các câu hỏi của tôi là:
Đây có phải là cách tốt nhất để chờ đợi cho đến khi tất cả các chủ đề được thực hiện?
EDIT: Ok, vì vậy tôi đã tìm ra lý do tại sao tôi nhận được một loạt lỗi sau khi tắt Trình thực thi của tôi, đó là vì tôi đang gọi hàm này trong một vòng lặp (thậm chí cả lần chạy) và không tạo Trình xử lý mới .
ThreadPoolExecutors hoàn hảo để tải xuống hình ảnh, nếu bạn không muốn 1000 chủ đề nghẽn giao diện mạng của bạn. BTW Tôi khá chắc chắn rằng Android sử dụng Executors để quản lý ASyncTask của họ đằng sau hậu trường. – manmal