Tôi đang cố gắng hiểu cách Callable
có thể trả lại giá trị khi nó chạy trên một chuỗi khác.Làm thế nào để một công việc có thể gọi dưới mui xe? Làm cách nào để một đối tượng có thể gọi trả về một giá trị?
Tôi đang tìm trong các lớp học Executors
, AbstractExecutorService
, ThreadPoolExecutor
và FutureTask
, tất cả có sẵn trong gói java.util.concurrent
.
Bạn tạo đối tượng ExecutorService bằng cách gọi một phương thức trong Executors (ví dụ: newSingleThreadExecutor()
). Sau đó, bạn có thể chuyển đối tượng có thể gọi với ExecutorService.submit(Callable c)
.
Vì phương pháp call()
được chạy bởi chuỗi được cung cấp bởi ExecutorService
, đối tượng trả về "nhảy" quay lại chuỗi đang gọi?
Nhìn vào ví dụ đơn giản này:
1 ExecutorService executor = Executors.newSingleThreadExecutor();
2 public static void main(String[] args) {
3 Integer i = executor.submit(new Callable<Integer>(){
4 public Integer call() throws Exception {
5 return 10;
6 }
7 }).get();
8 System.out.print("Returns: " + i + " Thread: " + Thread.currentThread.getName());
9 // prints "10 main"
10 }
Làm thế nào là nó có thể là số nguyên trong phương pháp gọi, được điều hành bởi một chủ đề riêng biệt, được trả lại cho các đối tượng Integer (hàng 3) để nó có thể được in bởi câu lệnh System.out
trong chủ đề chính (dòng 7)?
Không thể chạy chuỗi chính trước khi ExecutorService
chạy chủ đề của nó sao cho các bản in System.out statement
không có giá trị?
Có một vài lỗi biên dịch trong mã này; ví dụ, 'executor.submit' trả về một tương lai, không phải là một số nguyên, và' currentThread' là một phương thức cần được gọi. Nếu bất cứ ai quan tâm để xem một ví dụ làm việc, hãy xem http://ideone.com/myoMB –
Xin lỗi, tôi đã viết mã đó bằng tay. :-) Tôi sẽ xem xét ví dụ của bạn. – Rox
Ồ không sao cả, tôi chỉ cố gắng giúp đỡ thôi. Đó là một câu hỏi hay. +1 –