2010-03-17 29 views
6

Đây là một số mã mẫu từ một số example. Điều tôi cần biết là khi nào call() được gọi trên điện thoại có thể gọi? Điều gì kích hoạt nó?Khi nào phương thức call() được gọi trong Java Executor khi sử dụng các đối tượng Callable?

public class CallableExample { 

public static class WordLengthCallable 
    implements Callable { 
    private String word; 
    public WordLengthCallable(String word) { 
     this.word = word; 
    } 
    public Integer call() { 
     return Integer.valueOf(word.length()); 
    } 
} 

public static void main(String args[]) throws Exception { 
    ExecutorService pool = Executors.newFixedThreadPool(3); 
    Set<Future<Integer>> set = new HashSet<Future<Integer>>(); 
    for (String word: args) { 
     Callable<Integer> callable = new WordLengthCallable(word); 
     Future<Integer> future = pool.submit(callable); //**DOES THIS CALL call()?** 
     set.add(future); 
    } 
    int sum = 0; 
    for (Future<Integer> future : set) { 
     sum += future.get();//**OR DOES THIS CALL call()?** 
    } 
    System.out.printf("The sum of lengths is %s%n", sum); 
    System.exit(sum); 
    } 
} 

Trả lời

9

Khi bạn có submitted người gọi, người thực thi sẽ lên lịch cuộc gọi để thực thi. Tùy thuộc vào người thực thi, điều này có thể xảy ra trực tiếp hoặc khi một luồng có sẵn.

Gọi số get mặt khác chỉ chờ lấy kết quả tính toán.

Vì vậy, để được chính xác: Một nơi nào đó ở giữa submit được gọi và cuộc gọi đến get quay trở lại, cuộc gọi được gọi.

3

Toàn bộ ý tưởng sử dụng Executor là bạn không nên quan tâm khi chính xác phương pháp được gọi.

Điều duy nhất được đảm bảo nói chung là phương pháp sẽ được thực hiện khi get() của trả lại Future.

Khi chính xác nó sẽ được gọi phụ thuộc vào số Executor bạn sử dụng. Với nhóm chủ đề cố định mà bạn sử dụng trong ví dụ, phương thức call() sẽ được gọi ngay khi có một chuỗi miễn phí và không có nhiệm vụ nào khác ở phía trước nhiệm vụ đã cho trong hàng đợi (miễn là có đủ công việc, bạn sẽ có 3 call() cuộc gọi phương thức chạy tại bất kỳ thời điểm nào trong ví dụ của bạn).

+0

tôi hiểu được những vấn đề về chủ đề ngày càng trở nên có sẵn vào một thời điểm không thể đoán trước, tôi cần phải có hỏi 'khi nào có thể gọi ** được lên lịch **' - miễn là nó được lên lịch * gửi() * thì đó là tất cả những gì tôi cần biết :) – MalcomTucker

+0

@Malcom: Tôi không nghĩ rằng điều đó sẽ tốt hơn câu hỏi, vì lịch trình không hiển thị/quan sát được đối với chương trình, vậy điều gì sẽ thay đổi khi nó được lên lịch vào một thời điểm sau đó? –

0

Câu trả lời cho "khi sẽ một callable được lịch trình" nằm trong java.util.concurrent.ThreadPoolExecutor # thực thi (mặc định)

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