พิมพ์“ hello world” ทุก ๆ X วินาที


127

เมื่อเร็ว ๆ นี้ฉันใช้ลูปที่มีตัวเลขจำนวนมากเพื่อพิมพ์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++;
}

ฉันเข้าใจว่านี่เป็นวิธีที่โง่มากที่จะทำ แต่ฉันไม่เคยใช้ไลบรารีตัวจับเวลาใน Java เลย หนึ่งจะแก้ไขข้างต้นเพื่อพิมพ์ทุก 3 วินาทีพูดว่าอย่างไร


1
ในขณะที่คำตอบด้านล่างควรตอบคำถามของคุณอย่างชัดเจนคุณควรทราบด้วยว่าวิธีการที่คุณทำนั้นจะส่งผลให้เกิดช่วงเวลาที่แตกต่างกันในทุกเครื่อง ขึ้นอยู่กับความเร็วในการรันคอมไพเลอร์
IHazABone

ซ้ำซ้อนที่เป็นไปได้ของการเรียกใช้ฟังก์ชันทุก 10 นาที
Alex.K

คำตอบ:


187

นอกจากนี้คุณยังสามารถดูTimerและTimerTaskคลาสที่คุณสามารถใช้กำหนดเวลางานของคุณให้ทำงานทุกnวินาที

คุณต้องการคลาสที่ขยายTimerTaskและแทนที่public void run()เมธอดซึ่งจะถูกดำเนินการทุกครั้งที่คุณผ่านอินสแตนซ์ของคลาสนั้นไปยังtimer.schedule()เมธอด ..

นี่คือตัวอย่างที่พิมพ์Hello Worldทุก 5 วินาที: -

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 พารามิเตอร์scheduleจะดำเนินการหนึ่งครั้งหลังจากที่ล่าช้าที่ระบุ 3-param scheduleหรือscheduleAtFixedRateจะต้องมีการใช้
ทิมเบนเดอร์

2
ฮ่า ๆ ๆ บางครั้งฉันได้คะแนนมากขึ้นจากคำตอบและฉันไปพบว่าความเข้าใจของฉันเองดีขึ้นตั้งแต่ฉันงงงวยผ่านการแก้ปัญหา
ทิมเบนเดอร์

4
@ TimBender เพียงแค่สงสัยว่า OP ทำหน้าที่ของเขาให้สำเร็จหรือไม่;) อย่างไรก็ตามตอนนี้ฉันอยากจะใช้ExecutorServiceกับงานเหล่านี้หรือเปล่า นั่นคือการปรับปรุงที่ยิ่งใหญ่กว่า API เธรดดั้งเดิม ไม่ได้ใช้มันในขณะตอบรับ
Rohit Jain

4
Timer timer = new Timer(true);ควรตั้งtrueเป็น deamon ถ้าคุณต้องการให้ตัวจับเวลายังคงทำงานอยู่หลังจากปิดแอปพลิเคชัน
Tomasz Mularczyk

สิ่งนี้ช่วยฉันในที่สุดทำให้ฉันเข้าใจตัวนับเช่นกัน + 1. ติดตามการทำงานที่ดี!
Daniel Tork

197

หากคุณต้องการที่จะทำงานเป็นระยะ ๆ ScheduledExecutorServiceใช้ ScheduledExecutorService.scheduleAtFixedRateโดยเฉพาะ

รหัส:

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
ฉันหวังว่าคนอื่นจะสนับสนุนสิ่งนี้เช่นกัน Thread.sleep () อาจเหมาะสมกับรหัสใน OP ที่ดีที่สุด แต่มันเป็นการประดิษฐ์ใหม่ของมือสมัครเล่นของวงล้อ วิศวกรซอฟต์แวร์มืออาชีพจะใช้ API ที่ผ่านการทดลองและเชื่อถือได้เช่น TimerTask ScheduledExecutorService ดียิ่งขึ้นกว่าเดิม อ้างถึงไบรอันเก๊ et al. ของJava Concurrency ในการปฏิบัติ ชั้นเรียนหลังรอบเกือบสิบปี - มันเศร้าที่คำตอบอื่น ๆ ทั้งหมดมองข้ามไป
Michael Scheper

2
@MichaelScheper ขอขอบคุณฉันดีใจที่เห็นว่าคำตอบนี้เกินกว่าTimerTaskรุ่นที่แล้ว น่าสนใจฉันสังเกตเห็นว่าคำตอบที่ยอมรับนั้นไม่ถูกต้อง: \ อายุของทั้งสอง APIs นั้นScheduledExecutorServiceเป็นเพียงการประกาศอย่างสังหรณ์ใจ การใช้TimeUnitเป็นพารามิเตอร์ทำให้ชัดเจนยิ่งขึ้นว่าเกิดอะไรขึ้น 5*60*1000 // 5 minutesไปเป็นวันของรหัสเช่น
ทิมเบนเดอร์

2
@ TimBender ฉันสังเกตเห็นว่าคุณมี 3 สำหรับการโต้แย้งระยะเวลา ฉันไม่พบว่าเป็นวินาทีหรือมิลลิวินาที ฉันต้องการให้มันรันทุกๆ 500 มิลลิวินาที (ครึ่งวินาที)
JohnMerlino

2
อ่าฉันเข้าใจแล้ว อาร์กิวเมนต์ที่สี่ให้คุณระบุเวลาเช่น TimeUnit.MILLISECONDS
JohnMerlino

1
@TerryCarter ใน Java8 + คุณสามารถทำสิ่งRunnable helloRunnable = () -> { /*code */ };ที่สวยงามยิ่งขึ้นไปอีก);
Joel

39

ลองทำสิ่งนี้:

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

รหัสนี้จะเรียกใช้การพิมพ์เพื่อคอนโซลHello Worldทุกๆ5,000มิลลิวินาที ( 5วินาที) สำหรับข้อมูลเพิ่มเติมอ่านhttps://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html


16

ฉันคิดออกด้วยตัวจับเวลาหวังว่าจะช่วย ฉันใช้ตัวจับเวลาจากjava.util.TimerและTimerTaskจากแพ็คเกจเดียวกัน ดูด้านล่าง:

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)ภายในสำหรับวง

หมายเหตุ:จะต้องมีtry/catchบล็อก


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

วงวนไม่สิ้นสุดถูกสร้างขึ้นกำหนดเวลางานโฆษณา


4

วิธีที่ง่ายที่สุดคือการตั้งกระทู้หลักให้นอนหลับ 3000 มิลลิวินาที (3 วินาที):

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

สิ่งนี้จะหยุดเธรดอย่างน้อย X มิลลิวินาที ด้ายอาจนอนหลับได้นานขึ้น แต่นั่นก็ขึ้นอยู่กับ JVM สิ่งเดียวที่รับประกันได้คือเธรดจะนอนอย่างน้อยมิลลิวินาที ดูที่Thread#sleepเอกสาร:

สาเหตุด้ายขณะนี้การดำเนินการเพื่อการนอนหลับ (ชั่วคราวยุติการดำเนินการ) สำหรับการระบุจำนวนมิลลิวินาทีภายใต้ความแม่นยำและความถูกต้องของตัวนับของระบบและ schedulers


ขอบคุณ @Ligiggi Java จะตรวจสอบให้แน่ใจเสมอว่าเป็น 3000 มิลลิวินาทีไม่ว่าฉันจะใช้งานเครื่องอะไร (CPU) ใช่ไหม?
meiryo

@NandkumarTekale สนใจที่จะอธิบายรายละเอียดเพิ่มเติมหรือไม่
meiryo

4
@meiryo มันจะหยุดเธรดอย่างน้อย X มิลลิวินาที ด้ายอาจนอนหลับได้นานขึ้น แต่นั่นก็ขึ้นอยู่กับ JVM สิ่งเดียวที่รับประกันได้คือเธรดจะนอนอย่างน้อยมิลลิวินาที
Luiggi Mendoza

4
Caveat: หากนี่ไม่ใช่ระบบเรียลไทม์การนอนหลับจะมีอย่างน้อย 3000 ms แต่อาจนานกว่านั้น หากคุณต้องการนอนหลับอย่างหนัก 3000 มิลลิวินาทีโดยเฉพาะอย่างยิ่งในกรณีที่ชีวิตมนุษย์มีความเสี่ยง (เครื่องมือแพทย์เครื่องบินควบคุม ฯลฯ ) คุณควรใช้ระบบปฏิบัติการแบบเรียลไทม์
Kinjal Dixit

1
@meiryo: Luiggi และ kinjal อธิบายได้เป็นอย่างดี :)
Nandkumar Tekale

3

การใช้java.util.TimerและTimer#schedule(TimerTask,delay,period)วิธีการจะช่วยคุณ

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

นี่เป็นวิธีง่าย ๆ ในการใช้เธรดใน 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

เขาพูดอะไร. คุณสามารถจัดการข้อยกเว้นตามที่คุณต้องการได้ แต่ Thread.sleep (miliseconds); เป็นเส้นทางที่ดีที่สุดที่จะใช้

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

1

นี่เป็นอีกวิธีที่ง่ายโดยใช้ส่วนต่อประสานที่รันได้ในตัวสร้างเธรด

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

สำหรับแอปพลิเคชั่นขนาดเล็กมันก็ดีที่จะใช้ Timer และ TimerTask ตามที่ Rohit พูดถึง แต่ในเว็บแอปพลิเคชันฉันจะใช้Quartz Schedulerเพื่อจัดตารางงานและเพื่อทำงานตามระยะเวลาดังกล่าว

ดูแบบฝึกหัดสำหรับการตั้งเวลา Quartz


-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();
    }
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.