2009-10-05 11 views
12

Farz edelim ki bir java.util.concurrent.BlockingQueue öğesinden öğe çekme ve bunları işleme.ZamanlanmışExecutorService değişken gecikmeli

public void scheduleTask(int delay, TimeUnit timeUnit) 
{ 
    scheduledExecutorService.scheduleWithFixedDelay(new Task(queue), 0, delay, timeUnit); 
} 

nasıl sıklık dinamik olarak değiştirilebilir eğer görevi yeniden planlayın zamanlama/olabilir?

  • fikri veri güncellemeleri akışını almak ve kullanıcının
+0

Neden engelleme sırasını kullandığınız açık değil. Eğer sıra boşsa . Planlanan görevinizin engelleneceğini düşünüyorum. niyetin bu mu? Bu muhtemelen görev zamanlayıcı zamanlamasını karıştırır. –

+0

ArrayBlockingQueue uygulamasını threadafe olması, FIFO siparişine saygı duyması ve sınırlandırılması gerektiğinden seçtim. Görev engellese bile, görev zamanlamasının karıştırılmaması gerekir mi? – parkr

+0

Bir BlockingQueue uygulaması kullanmakta haklısınız (aslında ScheduledThreadPoolExecutor bir tane dahili olarak kullanıyor). Ancak, güncellemelerinizi bir zamanlayıcı kullanarak GUI'ye neden yayıyorsunuz? Neden gerçek zamanda yapmıyorsunuz? Çok fazla güncelleme var mı? Swing iplik eğirme hakkında endişeli misiniz? – Adamski

cevap

6

Sabit bir gecikme süresini değiştirebileceğinizi düşünmüyorum. Tek çekim yapmak için schedule() kullanmanız ve tamamlandıktan sonra tekrar programlamanız gerektiğini (gerekirse değiştirilmiş bir zaman aşımıyla) kullanmanız gerektiğini düşünüyorum.

+1

Teşekkürler - Bir örnek değişkeni 'delay' yaptım ve aşağıdakileri yapmak için özel bir yöntem ekledim: while (! ExecutorService.isShutdown) {executorService.schedule (new Task (sıra), delay, TimeUnit.MILLISECONDS); – parkr

1

kullanarak olmamalı güncellemeleri frekans değişir gerekir

  • GUI'ya toplu bunları yaymaktır Birkaç sıra görevi belirli bir aralıkta işlemeye çalışıyorsanız scheduleAtFixedRate? scheduleWithFixedDelay yalnızca belirtilen gecikmeyi bekler ve sonra sıradan bir görevi yürütür. Her iki durumda da ScheduledExecutorService numaralı schedule* yöntemleri ScheduledFuture referansı döndürecektir. Oranı değiştirmek isterseniz, ScheduledFuture'u iptal edebilir ve görevi farklı bir hız ile yeniden planlayabilirsiniz.

  • +0

    scheduleWithFixedDelay (...) - Verilen ilk gecikmeden sonra etkinleştirilen ve ardından bir yürütmenin sonlandırılması ile bir sonraki başlatmanın başlatılması arasındaki gecikme süresiyle etkinleştirilen belirli bir eylemi oluşturur ve çalıştırır. Görevin herhangi bir yürütme bir istisna ile karşılaştığında, sonraki yürütmeler bastırılır. Aksi takdirde, görev sadece icracı tarafından iptal veya feshedilerek sona erecektir. – parkr

    +0

    İptal ve yeniden zamanlama için bir kod örneği verebilir misiniz? Devam eden güncellemelerden ne haber? – parkr

    0

    scheduleWithFixedDelay (...) bir RunnableScheduledFuture döndürür. Yeniden zamanlamak için iptal edip yeniden planlayabilirsiniz. Bunu yeniden planlamak için, sadece RunnableScheduledFuture zekâ yeni Runnable sarabilir:

    new Runnable() { 
        public void run() { 
         ((RunnableScheduledFuture)future).run(); 
        } 
    }; 
    
    22

    Kullanım schedule(Callable<V>, long, TimeUnit) yerine scheduleAtFixedRate veya scheduleWithFixedDelay. Daha sonra, Callable 'unuzun kendisinin veya ileride bir noktada yeni bir Callable örneği olan'un yeniden ayarlandığından emin olun. Örneğin:

    // Create Callable instance to schedule. 
    Callable<Void> c = new Callable<Void>() { 
        public Void call() { 
        try { 
        // Do work. 
        } finally { 
        // Reschedule in new Callable, typically with a delay based on the result 
        // of this Callable. In this example the Callable is stateless so we 
        // simply reschedule passing a reference to this. 
        service.schedule(this, 5000L, TimeUnit.MILLISECONDS); 
        } 
        return null; 
        } 
    } 
    
    service.schedule(c); 
    

    Bu yaklaşım kapatıp ScheduledExecutorService yeniden ihtiyacını ortadan kaldırır.

    +0

    'Callable ' yerine 'Runnable' işlevini kullanabilirsiniz. – Thirler

    +0

    @Thirler: Evet, bu adil bir nokta. – Adamski

    +0

    Bir ScheduledExecutorService için 'program (Callable)' işlevini bulamıyorum. Sadece tüm parametrelere sahip olanlar. Lütfen beni nereye götürür müsün? Ya da en azından 0. – jlanza

    İlgili konular