SORU
11 ŞUBAT 2010, PERŞEMBE


Java özel durumları görevler ExecutorService

Sabit bir iş parçacığı sayısı ile ağır görevler çok sayıda çalıştırmak için Java ThreadPoolExecutor sınıf kullanmaya çalışıyorum. Görevleri sırasında özel durumlar nedeniyle başarısız olabilir birçok yer var.

Ve "afterExecute herhangi yakalanmamış istisnalar bir görev çalışırken karşılaşılan sağlamak gerekiyordu." yöntemi geçersiz ettim ThreadPoolExecutor alt ettim Ancak, o iş yapmak için görünmüyor olabilir.

Örneğin:

public class ThreadPoolErrors extends ThreadPoolExecutor {
    public ThreadPoolErrors() {
        super(  1, // core threads
                1, // max threads
                1, // timeout
                TimeUnit.MINUTES, // timeout units
                new LinkedBlockingQueue() // work queue
        );
    }

    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        if(t != null) {
            System.out.println("Got an error: "   t);
        } else {
            System.out.println("Everything's fine--situation normal!");
        }
    }

    public static void main( String [] args) {
        ThreadPoolErrors threadPool = new ThreadPoolErrors();
        threadPool.submit( 
                new Runnable() {
                    public void run() {
                        throw new RuntimeException("Ouch! Got an error.");
                    }
                }
        );
        threadPool.shutdown();
    }
}

Çıktı bu program "Her şey yolunda--durum normal tek Çalıştırılabilir iş parçacığı için gönderilen havuzu olsa" bir istisna atar. Burada ne herhangi bir ipucu?

Teşekkürler!

CEVAP
11 ŞUBAT 2010, PERŞEMBE


Eğer özel durumlar görev tarafından atılan işlemek istiyorsanız, o zaman genellikle daha iyi Runnable yerine Callable kullanın.

Callable.call() kontrol istisnalar atmak için izin verilir, ve bu iş parçasıyla geri bulaşan:

Callable task = ...
Future future = executor.submit(task);
try {
   future.get();
} catch (ExecutionException ex) {
   ex.getCause().printStackTrace();
}

Eğer Callable.call() bir özel durum oluşturursa, bu ExecutionException Bir sarılmış ve Future.get() tarafından atılmış olacak.

Bu ThreadPoolExecutor sınıflara çok tercih edilir olması muhtemeldir. Ayrıca, eğer özel bir kurtarılabilir ise yeniden görev için fırsat verir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • CareyHolzman

    CareyHolzman

    24 Ocak 2008
  • Influencer Plus

    Influencer P

    2 Ocak 2013