2012-12-10 21 views
5

Tôi đang đưa chủ đề vào một số ExecutorService.Làm thế nào để nhận thấy một ngoại lệ từ chuỗi gốc?

Các chủ đề này đang thao tác một số dữ liệu và nếu có xung đột, đối tượng dữ liệu sẽ ném ngoại lệ, bị chặn bởi chuỗi xung đột, do đó sẽ hủy và không hoàn thành quá trình thực thi.

Khi điều này xảy ra, chuỗi hủy bỏ cần phải được đưa trở lại vào hàng đợi và đưa trở lại vào trình thực thi.

Làm cách nào để biết liệu có ngoại lệ được ném ra khỏi chuỗi chính không?

Trả lời

11

Khi bạn submit() một công việc trên số ExecutorService bạn sẽ nhận được Tương lai. Khi thực hiện xong, bạn có thể gọi get() vào tương lai đó. Điều này sẽ trả lại kết quả nếu có, hoặc nó sẽ ném một ExecutionException nếu tác vụ gốc đã ném một. Nếu bạn muốn đối tượng ngoại lệ thực sự, bạn có thể làm getCause().

Cũng lưu ý rằng bạn sẽ đặt Task trở lại dịch vụ, nhiệm vụ đó được chạy trên Thread chưa thực sự chấm dứt (chỉ bị phát hiện ngoại lệ và đang chờ một mới).

Dưới đây là ví dụ về cách sử dụng (bạn có thể sử dụng Runnable nếu bạn không quan tâm đến kết quả).

Callable<String> myCallable = ...; 
Future<String> future = myExector.submit(myCallable); 

// Do something else until myCallable.isDone() returns true. 
try { 
    String result = future.get(); 
}catch(ExecutionException e){ 
    // Handle error, perhaps create new Callable to submit. 
} 
+1

Tôi rất mới với Java. Bạn có thể vẽ ví dụ về barebones bằng cách sử dụng các cuộc gọi đó không? – Aerovistae

+0

Đã thêm ví dụ – Thirler

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