'daki istisnalar nasıl geri alınır ve işlenir Birden çok iş parçacığı ayarlarında istisnaların üstesinden gelmenin bir yolunu bulmaya çalışıyorum. Bazı görevleri paralel olarak yürütmek istiyorum, her biri (temel olarak, başarısız olan görevi bir yürütme sırasına geri koyarak) tepki vermem gereken bir istisna atabilir. Ancak, iş parçacığı istisnası aslında bir geleceği oluşturmak ve get() yöntemini çağırmak için yalnızca bir yol gibi görünüyor. Ancak, bu aslında çağrıları senkronize çağrılara dönüştürür.Java'nın ExecutorService
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
Task task = taskQueue.poll(); // let's assume that task implements Runnable
try {
executor.execute(task);
}
catch(Exception ex) {
// record the failed task, so that it can be re-added to the queue
}
Ancak bu durumda tüm görevler başlattı, ancak istisnalar burada bu catch bloğunda yakalanmamak görünmüyor:
Belki bazı kod konuyu açıklığa kavuşturacaktır.Alternatif yerine dişin bir Future kullanmak ve sonuç almak için olacaktır: istisnalar catch bloğunda tamam yakalanırlarsa Bu durumda
try {
Future<?> future = executor.submit(task);
future.get();
}
...
ancak sahip fiyata beklenecek Bu işlem bitene kadar. Böylece, görevler istenildiği gibi sıralı ve paralel olarak yürütülmez.
Neyi eksik? Her birinin görevlerini nasıl yakalayabiliriz İstisnalar ve bunlara nasıl tepki verebilirsiniz?
Ama geleceğin yürütme sen istisna almak tamamlandığında ise (veya başarılı dönüş değeri). İlk yolunuz geleceği değerlendirmedeki istisnaları değil, geleceği geleceğe ekleyerek istisnaları yakalamaya çalışmaktır (ve geleceği atıyorsunuz). –