Spring高级运用之浅析多线程与计划任务

Spring对多线程的支持:
Spring通过任务调度器(TaskExecutor)来实现多线程和并发编程,使用ThreadPoolTaskExecutor可以实现一个基于线程池的TaskExecutor。而在实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步任务的支持,并且通过在实际开发执行的Bean的方法中使用@Async注解来声明其是一个异步任务。
创建配置类:

@Configuration
@ComponentScan("com.fuyunwang.taskexecutor")
@EnableAsync    //开启异步任务的支持
public class TaskExecutorConfig implements AsyncConfigurer {

    //得到基于线程池的TaskExecutor
    public Executor getAsyncExecutor() {

        ThreadPoolTaskExecutor taskExecutor=new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(25);
        taskExecutor.initialize();
        return taskExecutor;

    }

}

创建实体类:

@Service
public class AsyncTaskService {

    @Async//标记指定的方法是个异步方法
    public void executeAsyncTask(Integer i){
        System.out.println("异步执行任务:"+i);
    }

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

}

创建测试类

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
        AsyncTaskService service=context.getBean(AsyncTaskService.class);
        for(int i=0;i<10;i++){
            service.executeAsyncTask(i);
            service.executeAsyncTaskPlus(i);
        }
        context.close();
    }
}

Spring对于计划任务的支持:
从Spring3.1开始,计划任务在Spring中的实现变得异常的简单。首先通过在配置类上注解@EnableScheduling来开启对于计划任务的支持,然后在要执行的计划任务的方法上提供@Scheduled的注解,声明这个是计划任务
定义配置类:

@Configuration
@ComponentScan("com.fuyunwang.scheduler")
@EnableScheduling
public class TaskSchedulerConfig {

}

定义计划任务类:

@Service
public class ScheduledTaskService {
    private static final SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss");
    @Scheduled(fixedRate=5000)          //通过Scheduled来声明这个方法是计划任务,fixedRate属性指定每隔固定的时间执行指定的方法
    public void reportCurrentTime(){
        System.out.println("每隔5秒执行一次:"+dateFormat.format(new Date()));
    }

    @Scheduled(cron="0 28 11 ? * *")    //cron属性是按照指定的事件执行,cron是UNIX和类UNIX系统下的定时任务
    public void fixTimeExecution(){

    }
}

运行:

public class Main {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext configApplicationContext=new AnnotationConfigApplicationContext(TaskSchedulerConfig.class);

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章