2016-01-19 57 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)