扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
任务调度是大型J2EEweb应用中常见的工作。开发者希望以指定的间隔时间执行各类操作,并完成一些无需用户输入的任务。java中可有无数方法来做到这一点,但是在web应用中却并没有这方面的统一标准。当许多开发人员参与同一个项目,并且以各自不同的方式来实现任务调度时,就可能产生很大问题。内存和同步问题就是必须首先考虑的两件事。事实上,一些开发者试图调用操作系统层面的任务调度机制,如Unix平台上的cron。这种编程实践也许并不是太坏,但它将直接导致可移植性被抛到九霄云外。
创新互联建站专注于企业网络营销推广、网站重做改版、青原网站定制设计、自适应品牌网站建设、html5、商城网站定制开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为青原等各大城市提供网站开发制作服务。
JDK 自带的定时器实现
// schedule(TimerTask task, long delay) 延迟 delay 毫秒 执行
// schedule(TimerTask task, Date time) 特定时间执行
public static void main(String[] args) {
for (int i = 0; i 10; ++i) {
new Timer("timer - " + i).schedule(new TimerTask() {
@Override
public void run() {
println(Thread.currentThread().getName() + " run ");
}
}, 1000);
}
}
2. Quartz 定时器实现
//首先我们需要定义一个任务类,比如为MyJob02 ,
//该类需要继承Job类,然后添加execute(JobExecutionContext context)方法,在
//这个方法中就是我们具体的任务执行的地方。
//由希望由调度程序执行的组件实现的接口
public class MyJob02 implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
// 执行响应的任务.
System.out.println("HelloJob.execute,"+new Date());
}
}
public class QuartzTest5 {
public static void main(String[] args) throws Exception {
//SchedulerFactory 是一个接口,用于Scheduler的创建和管理
SchedulerFactory factory = new StdSchedulerFactory();
//从工厂里面拿到一个scheduler实例
//计划表(可能翻译的不太贴切),现在我们有了要做的内容,
//与调度程序交互的主要API
/*
* Scheduler的生命期,从SchedulerFactory创建它时开始,
到Scheduler调用shutdown()方法时结束;Scheduler被创建后,
可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作
(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,
才会真正地触发trigger(即执行job)
*/
Scheduler scheduler = factory.getScheduler();
//具体任务.
//用于定义作业的实例
//JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
//Trigger(即触发器) - 定义执行给定作业的计划的组件
//TriggerBuilder - 用于定义/构建触发器实例
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")).build();
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
3. Spring boot 任务调度(这个非常容易实现)
/*
* 开启对定时任务的支持
* 在相应的方法上添加@Scheduled声明需要执行的定时任务。
*/
@EnableScheduling
//@EnableScheduling注解来开启对计划任务的支持
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
public class ScheduledTasks {
private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
private int i=0;
//0 0 0 2 * ?
@Scheduled(cron="* * * 2 * ?")
//@Scheduled 注解用于标注这个方法是一个定时任务的方法
public void testFixDelay() {
logger.info("执行方法"+i++);
}
公众:类PrivilegeProcess {
公共静态无效的主要(字串[] args){
MyQueue的MyQueue的新MyQueue的();/ /声明队列
印刷电路板[PCB = {新的PCB(001 ,8,1),新的PCB(002,7,9),新的PCB(003,3,8),新的PCB(004,1,7),新的PCB(005,7,4)};
PCB段=新的PCB();
(INT I = 0; pcb.length; + +){/ /初始化先进行排序,选择排序这里使用的是高优先级的一线队
(J =我; pcb.length; J + +){
(PCB [I]。特权PCB [J]。特权){
段= PCB [1];
PCB [I] = PCB [J];
PCB [J] =段;
}
}
}
体系。通过out.println(“入队后第一时间的进程的顺序:”);
(INT I = 0; pcb.length; + +){
的System.out调用println(第一次入队#程序名称:“+ PCB [我]。名称+ totaltime:”+ PCB [I]。totaltime +“的”特权“+ PCB [我]。特权); }
();
myqueue.start(PCB);
}
}
类MyQueue的{
INT指数= 0;
PCB [] PC =新的PCB [5];
PCB [] PC1 =新的PCB [4];
PCB温度=新的PCB() BR /公共无效排队(PCB工艺){/ /排队算法
(指数== 5){
(“出界!”);
返回
}
PC [索引] =进程;
指数+ +;
}
公共:PCB DEQUEUE(){/ /出队算法(索引== 0)
返回空;
(INT I = 0; pc1.length; + +){
PC1 [I] = PC [ +1];
}
指数 -
温度= PC [0];
(INT I = 0; pc1.length; + +){ BR / PC [I] = PC1 [I];
}
回报条件;
}
公共无效启动(PCB [] PC){/ /进程表算法
(PC [0]。isNotFinish ==真| | PC [1 isNotFinish ==真| | PC [2 isNotFinish ==真| | PC [3]。时isNotFinish ==真| | PC [4]。isNotFinish ==){
/ / *注:| |运算符都是假的,所有的表达式结果为假,否则真
(INT I = 0; PC长度; + +){
PC [I]。运行(这一点); /} 的System.out.println();
(INT I = 0; pc.length; + +){/ /处理每个运行一次运行的时间片的长度重新排序优先一旦
(J =我; pc.length; J + +){
如果(PC [I]特权PC [J]。特权){
温度= PC [I];
PC [I] = PC [J];
PC [J] =温度;
}
}
}
}
}
}
类PCB {/ /声明过程级
和int名,totaltime ,运行时特权;
布尔isNotFinish的;
公众PCB(){
}
公开PCB(名称,诠释totaltime特权){
this.name =的名称;/ /进程名
this.totaltime = totaltime ;/ /
this.privilege =特权;/ /总时间优先 this.runtime = 2 ;/ /时间片值是2
this.isNotFinish =真;/ /是否执行完成
(“初始值:程序名称:”+名+“totaltime:”+ totaltime +“特权”+特权);
System.out的。调用println();
}
MyQueue的MQ公共无效的run(){/ /处理的基础上实施的时间片算法
(totalTime 1){ totaltime =运行;/ /总时间大于1,总时间=总时间 - 时间片
特权 -
(“程序名称:”+姓名+“ remaintime:“+ +”特权“+特权); totaltime
的} else if(totaltime == 1){
totaltime - ;/ /总时间为1时,执行时间为1
特权 -
(“程序名称:”+姓名+“remaintime:”+ totaltime +“特权”+特权);
}其他{
isNotFinish =假;/ / 0,将isNotFinish标志设置为假
}
如果(isNotFinish ==真){br mq.deQueue(); mq.enQueue(本); }
}
}
java Thread类实现定时调度,可以延迟几秒之后再执行,代码如下:
public class ceshi {
public static void main(String[] args) throws Exception {
// run in a second
final long timeInterval = 1000;
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
// ------- code for task to run
System.out.println("Hello !!");
// ------- ends here
try {
Thread.sleep(timeInterval);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(runnable);//线程创建
thread.start();//线程启动
}
}
运行结果:
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流