0

Birden çok Runnable işlemek için bir ScheduledExecutorService kullanan bir uygulama var: her biri sabit hızda ve uygulama kadar uzun süre canlı olmalıdır.Zamanlanmış görevler durumunu denetle

Bu parçacıklardan herhangi birinin bazı istisnalar için sonlandırılması durumunda bildirim almak için bir çözüme ihtiyacım var, bu yüzden bunları yeniden zamanlayabilirim.

Bu sorun için herhangi bir desen kullanabilir miyim? Yoksa uygulamada yanlış nesneleri mi kullanıyorum?

+0

http://stackoverflow.com/questions/21442322/scheduledexecutorservice-check-if-scheduled-task-has-already-been-complet –

cevap

0

istisnalar görev iptal edilmesine neden asla böylece sadece Runnable sarın eğer daha kolay olurdu:

executor.scheduleAtFixedRate(new CatchingRunnable(runnable), delay, period, unit); 

Sonra endişelenmenize gerek asla:

class CatchingRunnable implements Runnable { 
    private final Runnable delegate; 

    CatchingRunnable(Runnable delegate) { 
    this.delegate = delegate; 
    } 

    @Override public void run() { 
    try { 
     delegate.run(); 
    } catch (RuntimeException e) { 
     // Handle the exception somehow, e.g. log it. 
    } 
    } 
} 

Şimdi yoluyla runnable zamanlama onları yeniden programlamak hakkında.

+0

Bu iyi, ancak yapabileceğiniz her türlü özel durumu tahmin etmek zor olabilir. buna göre var ve halledin. Öneri: '' '' '' '' ''' '' bloğundan, yürütücüye sahip olan sınıfa geri dönün ve yeniden zamanlayın. Bunu yapmak için, muhtemelen aynı delegeyi yeniden oluşturmak için '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' 'yerine' '' '' '' '' '' '' yerine başka bir arayüzünüz olacaktır . –

+0

@JornVernee, elbette, belirli istisnaları belirli yollarla ele almak isteyebilirsiniz. Fakat 1) bu “bilinemez” istisnaları başka yollarla nasıl ele alırdınız? 2) Hedefiniz "başarısız olursa, yeniden başlat" ise, istisnanın türü önemli değil. –

+0

Evet, benim noktam 2 idi, istisnanın türü önemli değil. Öneri, bir istisna ile sona ererse runnable kendini yeniden planlanmış olmasıydı. Hepsi bu. –

0

Alternatif olarak, ScheduleFuture tamamlandığında yeniden göndermek için bir işleyiciyi tutabilirsiniz.