Sıfırlanabilir Java Zamanlayıcı

oy
36

java.I bir sıfırlanabilir zaman X saniye içinde gerçekleşmesi durumunda kapalı bir kez ayarlamanız gerekir ile bir java.utils.Timer olsun isterim. hiçbir şey zamanlayıcı oluşturulduğu zaman ve X saniye arasında olur, o zaman olayın normal olarak ortaya çıkar.

X saniye dolmadan Ancak, ben olay yerine Y saniye sonra gerçekleşmelidir karar verirseniz, o zaman olay Y saniyede gerçekleşir, böylece zamanı sıfırlamak için zamanlayıcı söylemek mümkün olmak istiyorum. Örneğin zamanlayıcı gibi bir şey yapmak mümkün olmalıdır:

Timer timer = new Timer();  
timer.schedule(timerTask, 5000); //Timer starts in 5000 ms (X)

//At some point between 0 and 5000 ms...  
setNewTime(timer, 8000);  //timerTask will fire in 8000ms from NOW (Y).

Eğer (iptal ararsanız ben tekrar zamanlayamazsınız), utils zamanlayıcı kullanarak bunu yapmanın bir yol göremiyorum.

Ben bu davranışı kopyalayan yakın geldim tek yolu javax.swing.Timer kullanmaktır ve orijinaldir zamanlayıcı durdurma ve yeni bir tane oluşturulmasını içerir. yani:

timer.stop();
timer = new Timer(8000, ActionListener);
timer.start();

Daha kolay bir yolu var mı ??

Oluştur 28/08/2008 saat 11:38
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
1

Tekrarlanan bir görev zamanlamak gerekir mi? Bu durumda ben kullanmayı düşünün tavsiye Quartz .

Cevap 28/08/2008 saat 11:54
kaynak kullanıcı

oy
1

Bunun ile yapmak mümkün olduğunu sanmıyorum Timer/TimerTask, ama tam olarak kullanmakta ile mutlu olabilir elde etmek istediğinize bağlı java.util.concurrent.ScheduledThreadPoolExecutor.

Cevap 28/08/2008 saat 12:47
kaynak kullanıcı

oy
48

Göre Timerbelgeler, itibaren Java 1.5, tercih etmelidir ScheduledThreadPoolExecutoryerine. (Kullanarak bu vasisi oluşturmak ister olabilecek kullanım kolaylığı için değil, bir gibi çok şey oluşturur .)Executors.newSingleThreadScheduledExecutor()Timer

Serin şey (çağırarak bir görev zamanlama zaman olduğu schedule()), bir döner ScheduledFuturenesne. Planlanan görevi iptal etmek için kullanabilir. Daha sonra farklı bir tetikleme süresi ile yeni bir görev göndermekte özgürsünüz.

ETA: Timeryaklaşık bağlantılı dokümantasyon hiçbir şey söylemez ScheduledThreadPoolExecutorancak OpenJDK versiyonu şunları söyledi:

Java 5.0 kişiye java.util.concurrentpaketi ve eşzamanlılık faydalardan biri içinde olduğu ScheduledThreadPoolExecutortekrar tekrar belirli bir oranda ya da gecikme görevleri yürütme için bir diş havuzu olan. Bu etkili için daha genel amaçlı yerine geçer Timer/ TimerTask çeşitli zaman birimlerini kabul eder çoklu hizmet konuları sağlar ve subclassing gerektirmez olarak, kombinasyon TimerTask(sadece uygulamak Runnable). Yapılandırma ScheduledThreadPoolExecutortek iplikle için eşdeğer kılar Timer.

Cevap 28/08/2008 saat 12:52
kaynak kullanıcı

oy
17

Eğer senin Timersadece hiç bunu sınıflara öneririm sonra çalıştırmak için bir görev var olacak:

import java.util.Timer;
import java.util.TimerTask;

public class ReschedulableTimer extends Timer
{
    private Runnable  task;
    private TimerTask timerTask;

    public void schedule(Runnable runnable, long delay)
    {
        task = runnable;
        timerTask = new TimerTask()
        {
            @Override
            public void run()
            {
                task.run();
            }
        };
        this.schedule(timerTask, delay);
    }

    public void reschedule(long delay)
    {
        timerTask.cancel();
        timerTask = new TimerTask()
        {
            @Override
            public void run()
            {
                task.run();
            }
        };
        this.schedule(timerTask, delay);
    }
}

Sen hatalı kullanılması durumunda çek eklemek için kod üzerinde çalışmak gerekir, ancak İstediğinizi elde etmelidir. ScheduledThreadPoolExecutorYa mevcut görevleri yeniden planlanması için destek inşa etmiş görünmüyor, ancak benzer bir yaklaşım da var çalışmalıdır.

Cevap 28/08/2008 saat 13:25
kaynak kullanıcı

oy
1

Bu Dışarı çalışıyorum budur. Dersim yoklamaları bir veritabanına bir TimerTask kullanılarak her 60 saniye var.

benim ana sınıfında, ben Timer örneği ve TimerTask benim yerel alt sınıfının bir örneğini tutmak. Ana sınıfı (60 ila 30 olacak demek) yoklama aralığı ayarlamak için bir yöntem vardır. İçinde, benim TimerTask iptal (bazı temizlik yapmak için iptal () yöntemini overwrote benim alt sınıf, ama bunun bir önemi olmamalı) ve daha sonra boş olun. i yeni bir örneğini yeniden, ve mevcut Timer yeni aralıklarla yeni örneği zamanlama.

Zamanlayıcı kendisi iptal olmadığı için, bu kalır aktif (ve bu yüzden başka herhangi TimerTasks içine) ve eski TimerTask yeni aynı olur biri, ama bakire ile değiştirilir (bu yana kullandığı iplik zamanlama için gerekli olan eski bir idam veya planlanmış olurdu, o), artık VIRGIN olduğunu.

i kapatmak için tüm zamanlayıcı istediğinizde, ben iptal edip boş TimerTask (TimerTask benim alt sınıf kaynaklara temizlemek için, yine, zamanlama değiştirirken benim yaptığım gibi aynı şekilde), ve sonra ben iptal edip boş Zamanlayıcı kendisi.

Cevap 16/04/2009 saat 15:09
kaynak kullanıcı

oy
3

Bütün Kod pasajı ben tam yardımcı olacağını umuyoruz .... böyle gider

{

        Runnable r = new ScheduleTask();
        ReschedulableTimer rescheduleTimer = new ReschedulableTimer();
        rescheduleTimer.schedule(r, 10*1000);


    public class ScheduleTask implements Runnable {
        public void run() {
            //Do schecule task

        }
      }


class ReschedulableTimer extends Timer {
        private Runnable task;
        private TimerTask timerTask;

        public void schedule(Runnable runnable, long delay) {
          task = runnable;
          timerTask = new TimerTask() { 
              public void run() { 
                  task.run(); 
                  }
              };

          timer.schedule(timerTask, delay);        
        }

        public void reschedule(long delay) {
            System.out.println("rescheduling after seconds "+delay);
          timerTask.cancel();
          timerTask = new TimerTask() { 
              public void run() { 
                  task.run(); 
              }
          };
          timer.schedule(timerTask, delay);        
        }
      }


}
Cevap 27/11/2012 saat 12:40
kaynak kullanıcı