spring boot-高级话题之 多线程、@EnableScheduling开启计划任务的支持(2)

spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。
ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。
实际开发中任务一般是非阻碍的,即异步的,通过@EnableAsync开启对异步任务的支持,
并通过实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。

1.@Async //1标识是是异步方法

package com.zh.ch3.taskexecutor;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncTaskService {
	
	@Async //1标识是是异步方法
    public void executeAsyncTask(Integer i){
        System.out.println("执行异步任务: "+i);
    }

    @Async
    public void executeAsyncTaskPlus(Integer i){
        System.out.println("执行异步任务:+1: "+(i+1));
    }

}
2.@EnableAsync // 1开启异步任务支持
package com.zh.ch3.taskexecutor;

import java.util.concurrent.Executor;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@ComponentScan("com.zh.ch3.taskexecutor")
@EnableAsync // 1开启异步任务支持
public class TaskExecutorConfig implements AsyncConfigurer {// 2配置AsyncConfigurer并重写getAsyncExecutor

	@Override
	public Executor getAsyncExecutor() {// 2
		ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
		taskExecutor.setCorePoolSize(5);
		taskExecutor.setMaxPoolSize(10);
		taskExecutor.setQueueCapacity(25);
		taskExecutor.initialize();
		return taskExecutor;
	}

	@Override
	public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
		return null;
	}

}
3.测试类

package com.zh.ch3.taskexecutor;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class);

		AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);

		for (int i = 0; i < 10; i++) {
			asyncTaskService.executeAsyncTask(i);
			asyncTaskService.executeAsyncTaskPlus(i);
		}
		context.close();
	}
}
测试结果:(单纯的异步加载,并未设计到锁机制)

执行异步任务: 3
执行异步任务: 1
执行异步任务: 4
执行异步任务:+1: 1
执行异步任务: 5
执行异步任务:+1: 6
执行异步任务: 6
执行异步任务:+1: 7
执行异步任务: 7
执行异步任务:+1: 8
=======================================================================

@EnableScheduling开启计划任务

1.

1@Scheduled:声明该方法是一个计划任务,fixedRate属性设置每隔固定时间执行

2cron属性:按照指定时间执行(11时28)cron事unix和类unix(linux)系统下的定时时间

package com.zh.ch3.taskscheduler;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class ScheduledTaskService {

	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

	@Scheduled(fixedRate = 5000) // 1@Scheduled:声明该方法是一个计划任务,fixedRate属性设置每隔固定时间执行
	public void reportCurrentTime() {
		System.out.println("每隔5秒执行一次: " + dateFormat.format(new Date()));
	}

	@Scheduled(cron = "0 28 11 ? * *") // 2cron属性:按照指定时间执行(11时28)cron事unix和类unix(linux)系统下的定时时间
	public void fixTimeExecution() {
		System.out.println("在指定时间内执行一次: " + dateFormat.format(new Date()) + "执行");
	}

}
2.@EnableScheduling //1@EnableScheduling:开启计划任务的支持
package com.zh.ch3.taskscheduler;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@ComponentScan("com.zh.ch3.taskscheduler")
@EnableScheduling //1@EnableScheduling:开启计划任务的支持
public class TaskSchedulerConfig {

}
测试

package com.zh.ch3.taskscheduler;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskSchedulerConfig.class);

	}

}
结果:每隔5秒执行一次: 17:02:27(每5秒执行一次)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值