作為Java開發人員,在使用spring框架的時候,如果想要獲取到線程池對象,可以直接使用spring框架提供的ThreadPoolxxx來獲取。那么在非spring環境下,main函數怎么使用ThreadPoolTaskScheduler呢?下面凱哥(凱哥Java:kaigejava)就來講講在main函數中怎么使用.
如果我們直接使用下面代碼:
ThreadPoolTaskScheduler();taskScheduler.setPoolSize(10);taskScheduler.setRemoveOnCancelPolicy(true);taskScheduler.setThreadNamePrefix("task-");ScheduledFuture<?>?scheduledFuture?=?taskScheduler.schedule(jobDTO,?cronTrigger);
在執行后,會報錯。錯誤信息:java.lang.IllegalStateException: ThreadPoolTaskScheduler not initialized
怎么解決呢?
import?org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import?org.springframework.scheduling.support.CronTrigger;public?class?MainApplication?{public?static?void?main(String[]?args)?{//?初始化?ThreadPoolTaskSchedulerThreadPoolTaskScheduler?taskScheduler?=?new?ThreadPoolTaskScheduler();taskScheduler.setPoolSize(10);taskScheduler.setRemoveOnCancelPolicy(true);taskScheduler.setThreadNamePrefix("task-");//?初始化你的任務和觸發器(這里假設?jobDTO?和?cronTrigger?已經定義)Runnable?jobDTO?=?/*?Your?Runnable?implementation?*/;CronTrigger?cronTrigger?=?/*?Your?CronTrigger?implementation?*/;//?設置任務調度器taskScheduler.initialize();//?使用任務調度器調度任務taskScheduler.schedule(jobDTO,?cronTrigger);} }
其實就是在調用任務器調度任務前執行taskScheduler.initializer()就可以了。
擴展:在Spring環境下使用ThreadPoolTaskScheduler
第一步:創建線程池配置
package?com.kaigejava.config;import?org.apache.commons.pool2.BasePooledObjectFactory; import?org.apache.commons.pool2.PooledObject; import?org.apache.commons.pool2.impl.DefaultPooledObject; import?org.apache.commons.pool2.impl.GenericObjectPool; import?org.apache.commons.pool2.impl.GenericObjectPoolConfig; import?org.springframework.context.annotation.Bean; import?org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import?org.springframework.stereotype.Component;import?javax.script.ScriptContext; import?javax.script.SimpleScriptContext; import?java.time.Duration;/***?線程池的配置類*?@version?1.0*/ @Component public?class?CollectTaskConfig?{@Bean(name?=?"collectTaskPool")public?ThreadPoolTaskScheduler?threadPoolTaskScheduler(){ThreadPoolTaskScheduler?threadPoolTaskScheduler?=?new?ThreadPoolTaskScheduler();threadPoolTaskScheduler.setPoolSize(30);threadPoolTaskScheduler.setRemoveOnCancelPolicy(true);threadPoolTaskScheduler.setThreadNamePrefix("task-");return?threadPoolTaskScheduler;}}
第二步:使用
@Resource(name?=?"collectTaskPool") private?ThreadPoolTaskScheduler?taskScheduler;public?void?taskDoing(){//?初始化你的任務和觸發器(這里假設?jobDTO?和?cronTrigger?已經定義)Runnable?jobDTO?=?/*?Your?Runnable?implementation?*/;CronTrigger?cronTrigger?=?/*?Your?CronTrigger?implementation?*/;//?使用任務調度器調度任務taskScheduler.schedule(jobDTO,?cronTrigger); }
通過上面兩步,就可以在Spring環境下使用帶有定時任務的線程池了。