Her X saniyede bir "merhaba dünya" yazdırın


127

Son zamanlarda yazdırmak için çok sayıda döngüler kullanıyorum Hello World:

int counter = 0;

while(true) {
    //loop for ~5 seconds
    for(int i = 0; i < 2147483647 ; i++) {
        //another loop because it's 2012 and PCs have gotten considerably faster :)
        for(int j = 0; j < 2147483647 ; j++){ ... }
    }
    System.out.println(counter + ". Hello World!");
    counter++;
}

Bunun bunu yapmanın çok aptalca bir yolu olduğunu anlıyorum, ancak Java'da henüz hiç zamanlayıcı kitaplığı kullanmadım. Her 3 saniyede bir yazdırmak için yukarıdakiler nasıl değiştirilir?


1
Aşağıdaki cevaplar sorunuzu açıkça cevaplasa da, bunu yapma şeklinizin her makinede farklı bir aralıkla sonuçlanacağına da dikkat etmelisiniz. Derleyiciyi ne kadar hızlı çalıştırabileceğine bağlıdır.
IHazABone

Yanıtlar:


187

Ayrıca bir göz alabilir Timerve TimerTaskher çalıştırmak için görevi zamanlamak için kullanabileceğiniz sınıfların saniye.

Yöntemi genişleten TimerTaskve geçersiz kılan, public void run()o sınıfın bir örneğini timer.schedule()yönteme her ilettiğinizde çalıştırılacak bir sınıfa ihtiyacınız var ..

Hello WorldHer 5 saniyede bir yazdıran bir örnek : -

class SayHello extends TimerTask {
    public void run() {
       System.out.println("Hello World!"); 
    }
}

// And From your main() method or any other method
Timer timer = new Timer();
timer.schedule(new SayHello(), 0, 5000);

9
2-param scheduleyönteminin belirtilen gecikmeden sonra bir kez çalıştırılacağını unutmayın. 3-param scheduleveya scheduleAtFixedRatekullanılması gerekir.
Tim Bender

2
lol, evet. Bazen cevaplar için artı oy alıyorum ve bir çözüm sunarak en son karıştırdığımdan beri kendi anlayışımın geliştiğini görmeye gidiyorum.
Tim Bender

4
@TimBender Sadece OP'nin bununla görevini gerçekten yapıp yapmadığını merak ediyorum;) Neyse, şimdi ExecutorServicebu görevler için kullanmayı tercih ediyorum . Bu, geleneksel Thread API'ye göre gerçekten büyük bir gelişme. Sadece cevap verirken kullanmadım.
Rohit Jain

4
Timer timer = new Timer(true);truedeamon olarak ayarlanmalıdır . Uygulamayı kapattıktan sonra zamanlayıcının hala çalışmasını istemiyorsanız.
Tomasz Mularczyk

Bu, nihayet zamanlayıcıları anlamama yardımcı oldu. +1. İyi çalışmayı sürdürün!
Daniel Tork

198

Periyodik bir görev yapmak istiyorsanız, bir ScheduledExecutorService. Özel olarak ZamanlanmışExecutorService.scheduleAtFixedRate

Kod:

Runnable helloRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello world");
    }
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 3, TimeUnit.SECONDS);

10
Umarım başka biri de buna olumlu oy verir. Thread.sleep (), koda en iyi şekilde uyabilir, ancak bu, tekerleğin oldukça amatörce yeniden icat edilmesidir. Profesyonel yazılım mühendisleri, TimerTask gibi denenmiş ve güvenilir API kullanacaktır. ScheduledExecutorService daha da iyidir; Brian Goetz ve diğerlerinin Pratikte Java Eş Zamanlılığına bakın . İkinci sınıf neredeyse on yıldır ortalıkta - tüm bu diğer yanıtların onu görmezden gelmesi üzücü.
Michael Scheper

2
@MichaelScheper, Teşekkürler, bu cevabın nihayet TimerTaskdeğişkeni aştığını görmekten memnunum . İlginç bir şekilde, kabul edilen cevabın aslında doğru olmadığını fark ettim: \ İki API'nin yaşı bir yana, ScheduledExecutorServicedaha sezgisel olarak açıklayıcı. TimeUnitParametresinin kullanılması, ne olup bittiğini çok daha açık hale getirir. Gibi kod günleri geride kaldı 5*60*1000 // 5 minutes.
Tim Bender

2
@TimBender Dönem argümanı için 3'ün olduğunu fark ettim. Bunun saniye mi yoksa milisaniye mi olduğunu bulamıyorum. Her 500 milisaniyede bir (yarım saniye) çalıştırmasını istiyorum.
JohnMerlino

2
Ahh anlıyorum. Dördüncü bağımsız değişken, zamanı belirtmenize izin verir, örneğin TimeUnit.MILLISECONDS.
JohnMerlino

1
@TerryCarter In Java8 + Bunun yerine Runnable helloRunnable = () -> { /*code */ };daha da güzel olanı yapabilirsiniz ;)
Joel


16

Bir zamanlayıcıyla çözüyorum, umarım yardımcı olur. Ben bir zamanlayıcı kullanmış java.util.Timerve TimerTaskaynı paketten. Aşağıya bakınız:

TimerTask task = new TimerTask() {

    @Override
    public void run() {
        System.out.println("Hello World");
    }
};

Timer timer = new Timer();
timer.schedule(task, new Date(), 3000);

10

Thread.sleep(3000)Döngü için içini kullanabilirsiniz .

Not: Bu bir try/catchblok gerektirecektir .


6
public class HelloWorld extends TimerTask{

    public void run() {

        System.out.println("Hello World");
    }
}


public class PrintHelloWorld {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new HelloWorld(), 0, 5000);

        while (true) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("InterruptedException Exception" + e.getMessage());
            }
        }
    }
}

sonsuz döngü oluşturulur reklam zamanlayıcı görevi yapılandırılır.


4

En kolay yol, ana iş parçacığını 3000 milisaniye (3 saniye) uyumaya ayarlamaktır:

for(int i = 0; i< 10; i++) {
    try {
        //sending the actual Thread of execution to sleep X milliseconds
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
    System.out.println("Hello world!"):
}

Bu, iş parçacığını en az X milisaniye durduracaktır. İş parçacığı daha fazla uyuyor olabilir, ancak bu JVM'ye bağlı. Garanti edilen tek şey, iş parçacığının en azından bu milisaniyelerde uyuyacağıdır. Dokümana bir göz atın Thread#sleep:

Sistem zamanlayıcılarının ve zamanlayıcıların hassasiyetine ve doğruluğuna bağlı olarak , şu anda yürütülmekte olan iş parçacığının belirtilen milisaniye sayısı boyunca uyumasına (yürütmeyi geçici olarak durdurmasına) neden olur .


Teşekkürler @Luiggi. Hangi makineyi (CPU) sağda çalıştırsam da, Java her zaman 3000 ms olmasını sağlayacaktır.
meiryo

@NandkumarTekale daha fazlasını detaylandırmak ister misiniz?
meiryo

4
@meiryo İş parçacığını en az X milisaniye durduracaktır. Konu daha fazla uyuyor olabilir, ancak bu JVM'ye bağlı. Garanti edilen tek şey, iş parçacığının en azından bu milisaniyelerde uyuyacağıdır.
Luiggi Mendoza

4
Uyarı: Bu gerçek zamanlı bir sistem değilse, uyku en az 3000 ms olacaktır, ancak daha uzun da olabilir. Özellikle insan hayatının risk altında olduğu yerlerde (tıbbi aletler, kontrol uçakları vb.) Tam 3000 ms uyku istiyorsanız, gerçek zamanlı bir işletim sistemi kullanmalısınız.
Kinjal Dixit

1
@meiryo: Luiggi ve kinjal çok iyi açıkladı :)
Nandkumar Tekale

3

Kullanım java.util.Timerve Timer#schedule(TimerTask,delay,period)yöntem size yardımcı olacaktır.

public class RemindTask extends TimerTask {
    public void run() {
      System.out.println(" Hello World!");
    }
    public static void main(String[] args){
       Timer timer = new Timer();
       timer.schedule(new RemindTask(), 3000,3000);
    }
  }

2

Bu, java'da thread kullanmanın basit yoludur:

for(int i = 0; i< 10; i++) {
    try {
        //sending the actual Thread of execution to sleep X milliseconds
        Thread.sleep(3000);
    } catch(Exception e) {
        System.out.println("Exception : "+e.getMessage());
    }
    System.out.println("Hello world!");
}

1

O ne dedi. İstisnaları istediğiniz gibi halledebilirsiniz, ancak Thread.sleep (milisaniye); izlenecek en iyi yoldur.

public static void main(String[] args) throws InterruptedException {

1

İşte Thread Constructor'da Runnable arayüzünü kullanmanın başka bir basit yolu

public class Demo {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T1 : "+i);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++) {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T2 : "+i);
                }
            }
        });

        Thread t3 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T3 : "+i);
                }
            }
        });

        t1.start();
        t2.start();
        t3.start();
    }
}



-1
public class TimeDelay{
  public static void main(String args[]) {
    try {
      while (true) {
        System.out.println(new String("Hello world"));
        Thread.sleep(3 * 1000); // every 3 seconds
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.