定時(shí)/計(jì)劃功能在Java應(yīng)用的各個(gè)領(lǐng)域都使用得非常多,比方說(shuō)Web層面,可能一個(gè)項(xiàng)目要定時(shí)采集話單、定時(shí)更新某些緩存、定時(shí)清理一批不活躍用戶等等。定時(shí)計(jì)劃任務(wù)功能在Java中主要使用的就是Timer對(duì)象,它在內(nèi)部使用多線程方式進(jìn)行處理,所以它和多線程技術(shù)關(guān)聯(lián)還是相當(dāng)大的。
一、相關(guān)知識(shí)學(xué)習(xí)
1、 Java定時(shí)器Timer
用于Java線程里指定時(shí)間或周期運(yùn)行任務(wù)。Timer是線程安全的,但不提供實(shí)時(shí)性(real-time)保證。
schdule方法:
schedule(TimerTask task, long delay)
以當(dāng)前時(shí)間為基準(zhǔn),延遲指定的毫秒后執(zhí)行一次TimerTask任務(wù)。
schedule(TimerTask task, Date time)
在指定的日期執(zhí)行一次TimerTask任務(wù)。
如果日期time早于當(dāng)前時(shí)間,則立刻執(zhí)行。
schedule(TimerTask task, long delay, long period)
以當(dāng)前時(shí)間為基準(zhǔn),延遲指定的毫秒后,再按指定的時(shí)間間隔地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。
schedule(TimerTask task, Date firstTime, long period)
在指定的日期之后,按指定的時(shí)間間隔地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。
scheduleAtFixedRate方法:
scheduleAtFixedRate(TimerTask task, long delay, long period)
以當(dāng)前時(shí)間為基準(zhǔn),延遲指定的毫秒后,再按指定的時(shí)間間隔周期性地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。
如果日期firstTime早于當(dāng)前時(shí)間,則立刻執(zhí)行,且不執(zhí)行在時(shí)間差內(nèi)的任務(wù)。
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
在指定的日期之后,按指定的時(shí)間間隔周期性地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。
如果日期firstTime早于當(dāng)前時(shí)間,則立即執(zhí)行,并補(bǔ)充性的執(zhí)行在時(shí)間差內(nèi)的任務(wù)。
2、 Java多線程學(xué)習(xí)
在java中要想實(shí)現(xiàn)多線程,有兩種手段,一種是繼續(xù)Thread類,另外一種是實(shí)現(xiàn)Runable接口。
java多線程之繼承Thread類創(chuàng)建線程類的步驟如下:
1.創(chuàng)建Thread類的子類,并重寫(xiě)run()方法。
2.創(chuàng)建Thread子類的實(shí)例即線程對(duì)象3.調(diào)用線程對(duì)象的start()方法
3.調(diào)用線程對(duì)象的start()方法
Thread類有以下常用構(gòu)造方法:
1.Thread()
2.Thread(String name)
3.Thread(Runnable r)
4.Thread(Runnable r,String name)
使用Thread類創(chuàng)建線程類,多個(gè)線程之間無(wú)法共享線程類的實(shí)例變量。
實(shí)現(xiàn)Runnable接口比繼承Thread類所具有的優(yōu)勢(shì):
1.適合多個(gè)相同的程序代碼的線程去處理同一個(gè)資源
2.可以避免java中的單繼承的限制
3.增加程序的健壯性,代碼可以被多個(gè)線程共享,代碼和數(shù)據(jù)獨(dú)立
4.線程池只能放入實(shí)現(xiàn)Runable或callable類線程,不能直接放入繼承Thread的類
二、訓(xùn)練
1、完成一個(gè)java application應(yīng)用程序,使用定時(shí)器編程,在實(shí)時(shí)顯示當(dāng)前時(shí)間,每1秒時(shí)鐘內(nèi)容更新一次。
java程序(test1.java)
import java.util.*;//導(dǎo)入java.util包下的所有類
public class test1 {
private static Timer timer = new Timer();//創(chuàng)建一個(gè)Timer類的實(shí)例
public static class MyTask extends TimerTask {//創(chuàng)建一個(gè)MyTask類繼承于父類TimerTask
@Override
public void run() {
System.out.println(“Now Time: ” + new Date().toString());//輸出當(dāng)前時(shí)間信息
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
timer.schedule(task, 0, 1000);//以當(dāng)前基準(zhǔn)時(shí)間延遲0秒后執(zhí)行一次,以后按指定間隔時(shí)間1秒無(wú)限次數(shù)的執(zhí)行。
}
}
運(yùn)行效果圖
2、完成一個(gè)java application應(yīng)用程序,在應(yīng)用程序主進(jìn)程中新開(kāi)一個(gè)線程,此線程進(jìn)行死循環(huán),每1秒被激活一次,激活時(shí)即在輸出顯示當(dāng)前時(shí)間。
java程序(test2.java)
import java.util.*;//導(dǎo)入java.util包下的所有類
public class test2 {
public static void main(String[] args) {
FirstThread a=new FirstThread();//創(chuàng)建一個(gè)FirstThread類對(duì)象
a.start();//開(kāi)啟線程
}
}
class FirstThread extends Thread{//創(chuàng)建Thread子類
public void run(){
try{//異常處理
while (true){//定義死循環(huán)
Thread.sleep(1000);//線程每隔1秒激活一次
System.out.println(“Now Time: ” + new Date().toString());//輸出當(dāng)前時(shí)間信息
}
}
catch(InterruptedException e){
}
}
}
運(yùn)行效果圖
3、完成一個(gè)java application應(yīng)用程序,此應(yīng)用程序公共類有一個(gè)double型類屬性(變量)x,初始值為0;在應(yīng)用程序主進(jìn)程中新開(kāi)兩個(gè)線程,這兩個(gè)線程都進(jìn)行死循環(huán);第1個(gè)線程每隔300ms激活一次,令類屬性x自加1.0并輸出顯示;第2個(gè)線程每隔400ms激活一次,令類屬性x自加0.1并輸出顯示。
java程序(test3.java)
public class test3{
static double x=0; //定義一個(gè)double型變量并賦值
public static void main(String[] args){
new Thread(new OneThread()).start();//開(kāi)啟線程
new Thread(new TwoThread()).start();//開(kāi)啟線程
}
public static class OneThread implements Runnable{//通過(guò)實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程類
public void run(){
while (true){//定義死循環(huán)
try{//異常處理
Thread.sleep(300);//線程每隔300ms激活一次
x=x+1;
System.out.println(“one:”+x);//輸出x
}
catch(InterruptedException e){
}
}
}
}
public static class TwoThread implements Runnable{//通過(guò)實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程類
public void run(){
while (true){//定義死循環(huán)
try{//異常處理
Thread.sleep(400);//線程每隔400ms激活一次
x=x+0.1;
System.out.println(“two:”+x);//輸出x
}
catch(InterruptedException e){
}
}
}
}
}
運(yùn)行效果圖
java 定時(shí)任務(wù)多線程處理
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer, AsyncConfigurer{
/** 異步處理 */
public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
TaskScheduler taskScheduler = taskScheduler();
taskRegistrar.setTaskScheduler(taskScheduler);
}
/** 定時(shí)任務(wù)多線程處理 */
@Bean(destroyMethod = “shutdown”)
public ThreadPoolTaskScheduler taskScheduler(){
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
scheduler.setThreadNamePrefix(“task-”);
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
/** 異步處理 */
public Executor getAsyncExecutor(){
Executor executor = taskScheduler();
return executor;
}
/** 異步處理 異常 */
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler(){
return new SimpleAsyncUncaughtExceptionHandler();
}
}
評(píng)論
查看更多