JAvaスケジューリング:(三)Timerでの単線プログラムの保護

3724 ワード

Timerでは単一のデーモンプロセスがすべてのタスクを実行していると聞いていましたが、スケジューリング時にいくつかの問題があります.次の例でテストします.
まず、2つの簡単なタスクを行います.
1. TimerJOB1
package test;

import java.util.Date;
import java.util.TimerTask;

public class TimerJOB1 extends TimerTask {
	public TimerJOB1(){
		super();
	}
	@Override
	public void run() {
		System.out.println("TimerJOB1:      :"+new Date());
		try {
			//    30 
			Thread.sleep(1000*30);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("TimerJOB1      :"+new Date());
		
	}

}

 
2.TimerJOB2
package test;

import java.util.Date;
import java.util.TimerTask;

public class TimerJOB2 extends TimerTask {
	public TimerJOB2(){
		super();
	}
	@Override
	public void run() {
		System.out.println("TimerJOB2:      :"+new Date());
		try {
			//    30 
			Thread.sleep(1000*30);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("TimerJOB2      :"+new Date());
		
	}

}

 
3.今から1秒後、5秒おきに実行 TimerJob 1は、TimerJob 1の実行時間が30 sより大きいため、1回目のスケジューリングが完了しない前に2回目のスケジューリングが開始されるべきで、何が起こるのでしょうか.
package test;
import java.util.Timer; 

public class TestTimer {	
	
	 public static void main(String[] args) { 
	 Timer timer = new Timer(); 
	 long delay1 = 1 * 1000; 
	 long period1 = 5*1000; 
	 //       1     ,   5      job1 
	 timer.schedule(new TimerJOB1(), delay1, period1); 
	 /**
	  * <pre>
	  *     :
	  * TimerJOB1:      :Fri Feb 22 15:20:32 CST 2013
		TimerJOB1      :Fri Feb 22 15:21:02 CST 2013
		TimerJOB1:      :Fri Feb 22 15:21:02 CST 2013
		TimerJOB1      :Fri Feb 22 15:21:32 CST 2013
		TimerJOB1:      :Fri Feb 22 15:21:32 CST 2013
		TimerJOB1      :Fri Feb 22 15:22:02 CST 2013
		TimerJOB1:      :Fri Feb 22 15:22:02 CST 2013
     </pre>
	  */
	 
		 } 
	}

 以上から分かるように、次のジョブは、現在のJOBが完了した後にのみ実行する.
4.2つのjobをそれぞれ呼び出すのは、5秒おきで、1つ目のjobは1回目がまだ実行されていません.2つ目のjobは1回目と1つ目のjobは2回目が実行されます.1つのjobをずっと呼び出すのですか、それともjob 1とjob 2が交代して呼び出すのですか.
package test;
import java.util.Timer; 

public class TestTimer {	
	
	 public static void main(String[] args) { 
	 Timer timer = new Timer(); 
	 long delay1 = 1 * 1000; 
	 long period1 = 5*1000; 
	 //       1     ,   5      job1 
	 timer.schedule(new TimerJOB1(), delay1, period1); 
	 long delay2 = 1 * 1000; 
	 long period2 = 1*5000; 
	 //       1     ,   5        job2 
	 timer.schedule(new TimerJOB2(), delay2, period2); 
	 /*
	 TimerJOB1:      :Fri Feb 22 15:25:47 CST 2013
	 TimerJOB1      :Fri Feb 22 15:26:17 CST 2013
	 TimerJOB2:      :Fri Feb 22 15:26:17 CST 2013
	 TimerJOB2      :Fri Feb 22 15:26:47 CST 2013
	 TimerJOB1:      :Fri Feb 22 15:26:47 CST 2013
	 TimerJOB1      :Fri Feb 22 15:27:17 CST 2013
	 TimerJOB2:      :Fri Feb 22 15:27:17 CST 2013
	 TimerJOB2      :Fri Feb 22 15:27:47 CST 2013
	 TimerJOB1:      :Fri Feb 22 15:27:47 CST 2013
	 TimerJOB1      :Fri Feb 22 15:28:17 CST 2013
	 TimerJOB2:      :Fri Feb 22 15:28:17 CST 2013
	 */
	 } 
	

}