Cetak “hello world” setiap X detik

127

Akhir-akhir ini saya telah menggunakan loop dengan jumlah besar untuk mencetak 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++;
}

Saya mengerti bahwa ini adalah cara yang sangat konyol untuk melakukannya, tetapi saya belum pernah menggunakan pustaka waktu di Jawa. Bagaimana orang akan memodifikasi di atas untuk mencetak setiap katakan 3 detik?

meiryo
sumber
1
Meskipun jawaban di bawah ini jelas harus menjawab pertanyaan Anda, Anda juga harus mencatat bahwa cara Anda melakukannya akan menghasilkan interval yang berbeda pada setiap mesin. Tergantung pada seberapa cepat dapat menjalankan kompiler.
IHazABone
Kemungkinan duplikat memanggil fungsi setiap 10 menit
Alex.K.

Jawaban:

187

Anda juga dapat melihat Timerdan TimerTaskkelas - kelas yang dapat Anda gunakan untuk menjadwalkan tugas Anda untuk dijalankan setiap ndetik.

Anda memerlukan kelas yang memperluas TimerTaskdan menimpa public void run()metode, yang akan dieksekusi setiap kali Anda melewati sebuah instance dari kelas itu ke timer.schedule()metode ..

Berikut ini contoh, yang mencetak Hello Worldsetiap 5 detik: -

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);
Rohit Jain
sumber
9
Perhatikan bahwa metode 2-param scheduleakan dijalankan sekali setelah penundaan yang ditentukan. 3-param scheduleatau scheduleAtFixedRateperlu digunakan.
Tim Bender
2
lol, ya. Kadang-kadang saya mendapatkan suara pada jawaban dan saya mencari untuk menemukan bahwa pemahaman saya sendiri telah meningkat sejak saya terakhir kacau dengan memberikan solusi.
Tim Bender
4
@TimBender Hanya ingin tahu apakah OP benar-benar menyelesaikan tugasnya dengan ini;) Bagaimanapun, sekarang saya lebih suka menggunakan ExecutorServiceuntuk tugas-tugas ini. Itu benar-benar peningkatan besar atas Thread API tradisional. Hanya saja tidak menggunakannya pada saat menjawab.
Rohit Jain
4
Timer timer = new Timer(true);harus ditetapkan truesebagai deamon. Kecuali Anda ingin timer tetap berjalan setelah menutup aplikasi.
Tomasz Mularczyk
Ini membantu saya akhirnya membuat saya memahami penghitung waktu juga. + 1. Terus bekerja dengan baik!
Daniel Tork
197

Jika Anda ingin melakukan tugas berkala, gunakan a ScheduledExecutorService. Khususnya PenjadwalanExecutorService.scheduleAtFixedRate

Kode:

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

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 3, TimeUnit.SECONDS);
Tim Bender
sumber
10
Saya harap ada orang lain yang memperbaiki ini juga. Thread.sleep () mungkin cocok dengan kode di OP terbaik, tapi itu adalah reinvention yang agak amatir. Insinyur perangkat lunak profesional akan menggunakan API yang dicoba dan tepercaya, seperti TimerTask. ScheduledExecutorService bahkan lebih baik lagi; lihat Java Concurrency in Practice karya Brian Goetz dkk . Kelas yang terakhir telah ada selama hampir satu dekade — sungguh menyedihkan bahwa semua jawaban lain mengabaikannya.
Michael Scheper
2
@MichaelScheper, Terima kasih, saya senang melihat bahwa jawaban ini akhirnya melampaui TimerTaskvarian. Menariknya, saya perhatikan bahwa jawaban yang diterima sebenarnya tidak benar: \ Umur kedua API, ScheduledExecutorServiceadalah deklaratif yang lebih intuitif. Penggunaan TimeUnitsebagai parameter membuatnya lebih jelas apa yang terjadi. Lewat sudah hari-hari kode seperti 5*60*1000 // 5 minutes.
Tim Bender
2
@TimBender Saya perhatikan Anda memiliki 3 untuk argumen periode. Saya tidak dapat menemukan apakah itu dalam hitungan detik atau milidetik. Saya ingin menjalankannya setiap 500 milidetik (setengah detik).
JohnMerlino
2
Ahh begitu. Argumen keempat memungkinkan Anda menentukan waktu misalnya TimeUnit.MILLISECONDS.
JohnMerlino
1
@TerryCarter Di Java8 + Anda malah bisa melakukan Runnable helloRunnable = () -> { /*code */ };yang lebih indah;)
Joel
16

Saya mencari tahu dengan timer, semoga membantu. Saya telah menggunakan timer dari java.util.Timerdan TimerTaskdari paket yang sama. Lihat di bawah:

TimerTask task = new TimerTask() {

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

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

Anda dapat menggunakan Thread.sleep(3000)di dalam untuk loop.

Catatan: Ini akan membutuhkan try/catchblokir.

kira22
sumber
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());
            }
        }
    }
}

infinite loop dibuat tugas penjadwal iklan dikonfigurasi.

Vicky
sumber
4

Cara termudah adalah dengan mengatur utas utama agar tidur 3000 milidetik (3 detik):

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!"):
}

Ini akan menghentikan utas setidaknya X milidetik. Utas bisa tidur lebih lama, tapi itu tergantung JVM. Satu-satunya hal yang dijamin adalah bahwa utas akan tidur setidaknya milidetik. Lihatlah Thread#sleepdokumen:

Menyebabkan thread yang saat ini mengeksekusinya tertidur (menghentikan sementara eksekusi) untuk jumlah milidetik yang ditentukan, tergantung pada ketepatan dan keakuratan timer dan penjadwal sistem .

Luiggi Mendoza
sumber
Terima kasih @Luiggi. Java akan selalu memastikan itu 3000 ms tidak peduli mesin apa (CPU) saya menjalankannya kan?
meiryo
@NandkumarTekale peduli untuk menjelaskan lebih lanjut?
meiryo
4
@meiryo Ini akan menghentikan utas setidaknya X milidetik. Utas bisa tidur lebih lama, tapi itu tergantung JVM. Satu-satunya hal yang dijamin adalah bahwa utas akan tidur setidaknya milidetik.
Luiggi Mendoza
4
Peringatan: jika ini bukan sistem waktu nyata, tidur akan setidaknya 3000 ms, tetapi bisa lebih lama. Jika Anda ingin tepat 3000 ms tidur terutama di mana kehidupan manusia berisiko (instrumen medis, mengendalikan pesawat dll), Anda harus menggunakan sistem operasi waktu nyata.
Kinjal Dixit
1
@meiryo: Luiggi dan kinjal menjelaskan dengan sangat baik :)
Nandkumar Tekale
3

Penggunaan java.util.Timerdan Timer#schedule(TimerTask,delay,period)metode akan membantu Anda.

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);
    }
  }
Subhrajyoti Majumder
sumber
2

Ini adalah cara sederhana untuk menggunakan utas di java:

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!");
}
pengguna3928455
sumber
1

Apa yang dia katakan. Anda dapat menangani pengecualian sesuka Anda, tetapi Thread.sleep (milidetik); adalah rute terbaik untuk ditempuh.

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

Berikut cara sederhana lain menggunakan antarmuka Runnable di Thread Constructor

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();
    }
}
Mayur Chudasama
sumber
0

Menambahkan Thread.sleep

try {
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
Russell Gutierrez
sumber
-1

Untuk aplikasi kecil tidak masalah untuk menggunakan Timer dan TimerTask seperti yang disebutkan Rohit tetapi dalam aplikasi web saya akan menggunakan Quartz Scheduler untuk menjadwalkan pekerjaan dan untuk melakukan pekerjaan berkala seperti itu.

Lihat tutorial untuk penjadwalan Kuarsa.

Nandkumar Tekale
sumber
-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();
    }
  }
}
pengguna3017805
sumber