java 线程 spring_java中spring里实现多线程
Spring通過(guò)任務(wù)執(zhí)行器(TaskExecutor)來(lái)實(shí)現(xiàn)多線程和并發(fā)編程的
可使用ThreadPoolTaskExecutor來(lái)實(shí)現(xiàn)基于線程池的TaskExecutor
在實(shí)際開(kāi)發(fā)中由于多是異步,所以使用@EnableAsync來(lái)支持異步任務(wù),且要在Bean的方法中使用@Async來(lái)聲明其是一個(gè)異步任務(wù)
????? 以下實(shí)例:
??? 配置類
class="配置類TaskExecutorConfig" name="code">package com.zgw.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.zgw.taskexecutor")
@EnableAsync //開(kāi)啟對(duì)異步任務(wù)的支持
public class TaskExecutorConfig implements AsyncConfigurer {
/**
* 通過(guò)實(shí)現(xiàn)AsyncConfigurer接口,重寫(xiě)getAsyncExecutor()方法,
* 返回一個(gè)ThreadPoolTaskExecutor對(duì)象,這樣實(shí)現(xiàn)一個(gè)基于線程池
* TaskExecutor
*/
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor=new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(10);
taskExecutor.setMaxPoolSize(20);
taskExecutor.setQueueCapacity(25);
taskExecutor.initialize();
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
任務(wù)執(zhí)行類
?????
Service" name="code">package com.zgw.taskexecutor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncTaskService {
@Async //聲明是一個(gè)異步方法
public void executeAsyncTaskOne(int i){
System.out.println("執(zhí)行異步任務(wù): "+i);
}
@Async
public void executeAsyncTaskTwo(int i){
System.out.println("執(zhí)行異步任務(wù)加1操作:"+(i+1));
}
}
?
?
3.運(yùn)行
package com.zgw.taskexecutor;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestExecutor {
public static void main(String[] args) {
//使用AnnotationConfigApplicationContext作為spring容器,
//接收輸入一個(gè)配置類作為參數(shù)
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
//獲得聲明配置的AsyncTaskService的Bean
AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);
for(int i =0 ;i<20;i++){
asyncTaskService.executeAsyncTaskOne(i);
asyncTaskService.executeAsyncTaskTwo(i);;
}
context.close();
}
}
?
3.運(yùn)行
?
package com.zgw.taskexecutor;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestExecutor {
public static void main(String[] args) {
//使用AnnotationConfigApplicationContext作為spring容器,
//接收輸入一個(gè)配置類作為參數(shù)
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
//獲得聲明配置的AsyncTaskService的Bean
AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);
for(int i =0 ;i<20;i++){
asyncTaskService.executeAsyncTaskOne(i);
asyncTaskService.executeAsyncTaskTwo(i);;
}
context.close();
}
}
?
? 運(yùn)行結(jié)果如下:
?
?
?結(jié)果是并發(fā)執(zhí)行而不是順序執(zhí)行的。
?
????
spring_thread.rar (10.1 KB)
下載次數(shù): 0
總結(jié)
以上是生活随笔為你收集整理的java 线程 spring_java中spring里实现多线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 爬虫python能做游戏吗_一入爬虫深似
- 下一篇: 日照职业单招计算机专业,日照职业技术学院