インスタンスに従ってjavaマルチスレッド10-タイミングタスクインスタンスQuartzなどを学習する


タイミングタスクは私たちがよく出会うビジネスシーンであり、私たちは多くの機能を実現するためにこのような技術が必要です.例えば、タイミングでいくつかのデータpushを取得し、タイミングでいくつかのクリーンアップタスクを処理し、ある値をタイミングでチェックするなどです.では、私たちはどのように実現すべきか、実現の中で何に注意すべきか.
タイミングタスクは別のスレッドを開いて実行することであり、実際には同時実行の一種でもある.タイミングのjobで他のクラスのメソッドを呼び出し、通常のビジネスロジックでもそのクラスのメソッドを呼び出すと、ある偶然の時間にそのクラスの呼び出しが同時に発生する可能性があります.
タイミングタスクを書くときも注意しなければなりません
1:実行頻度が高く、タスクの実行に時間がかかる場合は、jobの実行方法に同期処理を加えます.
2:jobで他のクラスメソッドを呼び出す場合、他のクラスが提供するメソッドもスレッドにパブリッシュされる安全性を保証します.
次に、タイミングタスクを実装する方法をいくつか例に挙げます.
1:java提供timer
package com.home.thread.thread10;

import java.util.Date;
import java.util.Timer;

/**
 * @author gaoxu
 *  !
 */
public class TimerMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Timer timer = new Timer();
		timer.schedule(new TimerTaskThread(), new Date(), 2000);
	}

}
package com.home.thread.thread10;

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

/**
 * @author gaoxu
 *  !
 */
public class TimerTaskThread extends TimerTask{
	// 
	public TimerTaskThread(){
		
	}
	// 

	@Override
	public synchronized void run() {
		System.out.println(new Date().toString()+"Timer , ");
		// 
		
	}

}

これはtimerによって実現されるタイミングタスクで、実行結果は次のとおりです.
Sat Feb 07 01:25:31 CST 2015,Timer , 
Sat Feb 07 01:25:33 CST 2015,Timer , 
Sat Feb 07 01:25:35 CST 2015,Timer , 
Sat Feb 07 01:25:37 CST 2015,Timer , 

2:オープンソースフレームワークQuartzによるタイミングタスク
package com.home.thread.thread10;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

import com.home.JobServiceImpl;

/**
 * @author gaoxu
 *  !
 */
public class SchedulerMain {
	public static void main(String[] para) {
		
		try {
			SchedulerFactory sf = new StdSchedulerFactory();
			Scheduler scheduler = sf.getScheduler();
			JobServiceImpl jobService = new JobServiceImpl();
			jobService.setScheduler(scheduler);
			jobService.platDataCollectInterval(2);
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
package com.home;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;

import com.home.job.TestJob;


/**
 * @author gaoxu
 *  !
 */
public class JobServiceImpl {

	private Scheduler scheduler;

	public void setScheduler(Scheduler scheduler) {
		this.scheduler = scheduler;
	}

	public Scheduler getScheduler() {
		return scheduler;
	}

	public void platDataCollectInterval(int interval)
			throws SchedulerException, Exception {
		System.out.println("update  PlatDataCollect cycle start");

		JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity("testJob_1", "group_1").build();

		Trigger trigger = TriggerBuilder
				.newTrigger()
				.withIdentity("trigger_1", "group_1")
				.withSchedule(
						SimpleScheduleBuilder
								.repeatSecondlyForever(interval)).build();

		scheduler.scheduleJob(jobDetail, trigger);

		scheduler.start();

	}

}
package com.home.job;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TestJob implements Job{

	@Override
	public synchronized void execute(JobExecutionContext arg0) throws JobExecutionException {
		 System.out.println("test job date:" + new Date().toString());  
		
	}

}

ここには3つのクラスがあり、jobクラスはタスクの実行者であり、Schedulerは1つのスケジューラであり、スケジューラには複数のTriggerを作成することができ、各Triggerは1つのjobを実行することができる.
log4j:WARN No appenders could be found for logger (org.quartz.impl.StdSchedulerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
update  PlatDataCollect cycle start
test job date:Sat Feb 07 01:30:31 CST 2015
test job date:Sat Feb 07 01:30:33 CST 2015
test job date:Sat Feb 07 01:30:35 CST 2015
test job date:Sat Feb 07 01:30:37 CST 2015

3:スレッドによる実装
package com.home.thread.thread10;

/**
 * @author gaoxu
 *  !
 */
public class ThreadMain {
	public static void main(String[] para) {
		ThreadTask threadTask = new ThreadTask();
		threadTask.start();
	}

}
package com.home.thread.thread10;

import java.util.Date;

public class ThreadTask extends Thread{
	
	public void run(){
		while(true){
			try {
				Thread.sleep(2000);
				System.out.println(new Date().toString()+" , ");
				// 
			} catch (InterruptedException e) {
				
				e.printStackTrace();
			}
			
		}
	}
}

実行結果:
Sat Feb 07 01:33:34 CST 2015 , 
Sat Feb 07 01:33:36 CST 2015 , 
Sat Feb 07 01:33:38 CST 2015 , 
Sat Feb 07 01:33:40 CST 2015 , 
Sat Feb 07 01:33:42 CST 2015 , 

javaのような仕事のタスクを実現する方法もたくさんあります.util.concurrent.ScheduledThreadPoolExecutor、ここでは例を挙げません.
同時エラーが発生しないように、タイミングタスクの同時性に注意してください.