2009-11-24 32 views
5

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 .

Trả lời

9

Bạn đang sử dụng loại trình xử lý nào?

ThreadPoolExecutor.awaitTermination() sẽ thực hiện những gì bạn đang hỏi (đó là hoạt động tham gia hàng loạt hiệu quả).

Tổng cộng, ThreadPoolExecutor sẽ cho phép bạn đặt giới hạn về số chuỗi, v.v ... (có thể tốt hơn là đệ quy giống như những gì bạn đang làm nếu số lượng chủ đề tăng cao, không chắc chắn).

PS - Tôi nghi ngờ rằng người thực thi sẽ làm cho mã của bạn chạy nhanh hơn, nhưng chúng có thể làm cho mã của bạn dễ đọc và duy trì hơn. Sử dụng một hồ bơi Thread sẽ làm cho mọi thứ nhanh hơn cho loại thuật toán này, và Executor làm cho nó dễ dàng để làm việc với các nhóm luồng.

+1

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

1

- Tôi nghi ngờ rằng Chấp hành sẽ làm cho mã của bạn chạy nhanh hơn, nhưng họ có thể làm cho mã của bạn dễ dàng hơn để đọc và duy trì. Sử dụng một hồ sơ chủ đề sẽ làm cho mọi thứ nhanh hơn cho loại thuật toán này và Trình thực thi giúp bạn dễ dàng làm việc với các nhóm luồng.

Điều này không đúng.

Người thực thi có thể được 'sao lưu' bởi bất kỳ số lượng hệ thống thực thi khác nhau bao gồm chuỗi được gộp chung.

Bạn cần gọi đúng tên nhà máy. Ngoài ra, bạn cũng cần phải quyết định chính sách xử lý các tình huống mà công việc được gửi đến hàng đợi nhanh hơn mức có thể được tiêu thụ, bởi vì bạn có thể không ban đầu hết bộ nhớ do giới hạn khi thực hiện chuỗi, nhưng nếu bạn xếp hàng triệu công việc, thì họ phải được lưu trữ một số nơi trong khi họ chờ đợi để thực hiện.

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