在Java TimerTask

时间:2016-03-19 12:39:04

标签: java loops timertask

如何在设定的时间内连续无延迟地在TimerTask内运行一组特定的指令?以下是我试图实现上述代码的代码。

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    public void run() {
        System.out.println("Test started at: " + new Date());

        // Do something continuously without delay

        System.out.println("Test finished at: " + new Date());                           
    }
}, 0);

1 个答案:

答案 0 :(得分:1)

schedule方法的第二个参数是开始计时器任务的时间(或相对于现在的延迟),而不是计时器执行的时间长度。

你的问题并不完全清楚,但我假设你希望将来在特定时间(或相对于现在的延迟)开始和停止任务。如果是这样,我接近这个的方法是创建一个Thread来完成你需要的任务。由于TimerTaskRunnableThreadTimer启动后以TimerTask执行,因此您只需使用该Runnable的实例即可。确保running包含public void run() { while(running) { /* do my task */ } } 之类的可设置字段。在该Thread中,在while循环中运行您的任务,如下所示:

Timer

然后,使用一个Runnable安排running在您需要时开始。使用另一个Timer在您希望它停止时将同一个Thread的running参数设置为false。 class StoppableTimerTask extends TimerTask { private volatile boolean running = true; public void stopRunning() { this.running = false; } public void run() { while(running) { /* do my task */ } } } final StoppableTimerTask task = new StoppableTimerTask(); timer.schedule(task, startTime); timer.schedule(new TimerTask() { public void run() { task.stopRunning(); } }, stopTime); 参数应该是volatile,以确保第一个计时器Thread立即看到对第二个计时器Thread的更改。所以它看起来像这样(未经测试):

running

根据您的“内容”,您可能还需要查看线程中断。例如,如果它正在执行阻塞IO,则代码将不会循环并检查TimerTask值,直到阻塞IO完成。中断线程(可能)会导致这种情况发生。见http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt--。这可能会也可能不会起作用,并且可能很难做到正确,所以如果你需要这个线程尽可能接近所需的时间退出,那么更喜欢运行阻塞I / O和类似的操作以及更小的超时,这样线程可以检查是否应继续更频繁地运行。

更新:根据指示任务应立即开始的评论,它变得更加简单。初始任务甚至不需要扩展Thread - 它可以是立即启动的常规<html> <head> <link rel="stylesheet" href="bootstrap/css/bootstrap.css"/> <script type="text/javascript" src="jquery.js"> </script> <script type="text/javascript" src="bootstrap/js/bootstrap.js"> </script> <TITLE> New Registration Form </TITLE></head> <body> <center> <br> <p style="font-weight: bold; font-size: 30">Please Fill Out Your Information Sheet</p><p><?php echo date('F j, Y, g:i a', time()+25200); ?></p> <form method="POST" action="add.php"> <!--<input type="text" name="new_fname" class="Form-Control" placeholder="First Name" id="fname" required>--> <input type="text" name="new_fname" class="Form-Control" placeholder="First Name" id="fname" required> <input type="text" name="new_mname" class="Form-Control" placeholder="Middle Initial" id="mname" required> <input type="text" name="new_lname" class="Form-Control" placeholder="Last Name" id="lname" required><br><br> Select Your gender <select name="new_gender"> <option value=""></option> <option value="Male">Male</option> <option value="Female">Female</option> </select> Select Your Status <select name="new_status"> <option value=""></option> <option value="New">New</option> <option value="Old">Old</option> <option value="Transferee">Transferee</option> <option value="Shiftee">Shiftee</option> </select> Select Your Course <select name="new_course"> <option value=""></option> <option value="BSINFOTECH">BSINFOTECH</option> <option value="BSIS">BSIS</option> <option value="BSCOMTECH">BSCOMTECH</option> </select> <br><br> <input type="text" name="new_age" class="Form-Control" placeholder="Age" id="age" required><br><br> <input type="text" name="new_bp" class="Form-Control" placeholder="Birth Place" id="bp" required><br><br> <input type="text" name="new_add" class="Form-Control" placeholder="Address" id="add" required><br><br> <input type="text" name="new_nat" class="Form-Control" placeholder="Nationality" id="nat" required><br><br> <input type="text" name="new_rel" class="Form-Control" placeholder="Religion" id="rel" required><br><br> <input type="text" name="new_tel" class="Form-Control" placeholder="Tel. No." id="tel" required><br><br> <input type="text" name="new_cel" class="Form-Control" placeholder="Cel. No." id="cel" required><br><br> <input type="text" name="new_mail" class="Form-Control" placeholder="E-mail Address" id="mail" required><br><br> <button onclick="parent.location='req.php'" type="submit" name="next">Next</button> <button type="submit" class="btn" name="save" value="save">Save</button> </form> </body> </html> 。只需要在指定的未来时间停止计时器。