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?


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

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);

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);

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

39

Coba lakukan ini:

Timer t = new Timer();
t.schedule(new TimerTask() {
    @Override
    public void run() {
       System.out.println("Hello World");
    }
}, 0, 5000);

Kode ini akan menjalankan cetak untuk menghibur Hello World setiap 5000 milidetik ( 5 detik). Untuk info lebih lanjut, baca https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html


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);

10

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

Catatan: Ini akan membutuhkan try/catchblokir.


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.


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 .


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);
    }
  }

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

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 {

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


-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.


-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();
    }
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.