2016-01-19 59 views
0

我有这个简单的应用程序的Java定时器等待任务下一个任务之前完成开始

package testy; 

import java.util.Timer; 
import java.util.TimerTask; 
import static testy.Test.log; 

public class Test { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws InterruptedException { 
    Timer timer = new Timer(true); 
    log("tasks start"); 
    timer.schedule(new Task1(), 1,120000); 
    timer.schedule(new Task2(), 3000,120000); 
    timer.schedule(new Task3(), 6000,120000); 

    Thread.sleep(99999999L); 
} 

static void log(String text) { 
    System.out.println(text); 
} 
} 

class Task1 extends TimerTask { 
    @Override 
    public void run() { 
     log("Task1 start"); 
     try { 
      Thread.sleep(12000L); 
     } catch (InterruptedException ex) { 
      log("interupted"); 
     } 
     log("Task1 end"); 
    } 
} 

class Task2 extends TimerTask { 
    @Override 
    public void run() { 
     log("Task2 start"); 
     try { 
      Thread.sleep(12000L); 
     } catch (InterruptedException ex) { 
      log("interupted"); 
     } 
     log("Task2 end"); 
    } 
} 

class Task3 extends TimerTask { 
    @Override 
    public void run() { 
     log("Task3 start"); 
     try { 
      Thread.sleep(12000L); 
     } catch (InterruptedException ex) { 
      log("interupted"); 
     } 
     log("Task3 end"); 
    } 
} 

从这个代码,我想到的是任务1将被立即解雇和Task2将在3秒后发射(如延迟时间说的)。但是,Task2正在等待Task1完成并在此之后立即被触发。日志:

tasks start 
Task1 start 
Task1 end 
Task2 start 
Task2 end 
Task3 start 
Task3 end 
Task1 start 
Task1 end 
Task2 start 
Task2 end 
Task3 start 
Task3 end 

据我了解Java定时器,任务应独立解雇。为什么然后这个应用程序的行为是不同的?如何在给定时间精确地完成启动任务,而不必关心Timer1是否完成?

感谢您的帮助!

回答

2

引述Javadoc

对应每一个定时器对象是用于执行所有的定时器的任务,依次单个后台线程。

如果您需要使用Timer所描述的行为,则需要多个Timer实例。

+0

我看到我得到了Timer的想法错误然后。标记为答复,因为doc引用。非常感谢! – user3597356

3

Timer使用单线程。当您拨打Thread.sleep(12000L);时,此线程被阻止,无法执行其他任务。尝试使用ScheduledExecutorService实现,而不是使用更大的线程池。你可以创建一个简单的线程池与此:

java.util.concurrent.Executors.newScheduledThreadPool(corePoolSize)