您的位置:首页 > 编程语言 > Java开发

Spring 任务

2016-06-19 13:39 393 查看
引用原文地址

普通任务

1.开启线程:

public class EmailTask implements Runnable {

private String message;

public EmailTask(String message) {
this.message = message;
}

public void run() {
//send message
}
}


这样做存在一系列问题:

1. 代码可复用性极差,对于所有需要异步执行的任务,都需要自己编写新线程逻辑

2. 当用户量变大了以后,例如有10000个用户在我们的系统中同时进行

评论,那么系统中也就有10000个线程在同时执行,这很有可能就把系 统给压垮了

2.Task Executor

为了解决上述问题,Spring框架内置了任务执行器(Task Executor)来执行异步任务,执行代码如下:

@Autowired
private TaskExecutor taskExecutor;

public void printMessages() {
for(int i = 0; i < 25; i++) {
taskExecutor.execute(new EmailTask("Message" + i));
}
}


我们并非在代码中直接启动新线程来执行EmailTask,而是将它交给了Spring内置的Task Executor。这个TaskExecutor相当于一个线程池,它根据实际情况来决定何时执行线程池中的任务,我们可以定义同时执行线程的最大数量,这样Task Executor就可以通过类似排队的机制来解决并发量过高的问题。

为了激活Spring框架预定义的Task Executor,需要在配置中加上:

@EnableScheduling
public class Application {
}


这样Spring应用上下文中就会自动配置一个任务执行器。在真正执行异步任务时,也无需我们自己显式地调用TaskExecutor和定义实现Runnable接口的任务,只需要加上@Async注解就可以了:

@Async
public void sendEmail() {
}


Spring一旦发现方法上有@Async注解,就会自动生成一个实现了Runnable接口的类,并且将它实例化后交给TaskExecutor来执行。

定时任务

@Component
public class ScheduledTasks {

@Scheduled(cron = ""0 0 12 * * ?")//每天中午12点触发执行
public void reportCurrentTime() {
sendEmail();
}
}


@Scheduled注解支持Cron表达式,同时也支持使用fixedRate属性在固定间隔来支持任务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 线程 任务