여러 스레드에서 여러 작업을 모두 수행한 후 TaskExecutorConfig CountDownLatch로 일괄 복귀
3874 단어 기술 인생
java.util.concurrent 패키지 아래의 클래스 Executor
java.util.concurrent ExecutorService pool = Executors.newCachedThreadPool(); 4
springboot 프로젝트에서 프레임워크에 봉인된 스레드 탱크와 주석을 이용하여 비동기를 실현할 수 있다는 것이 이번 설명의 중점입니다
우선 구성 클래스
@Component
@Configuration
public class TaskExecutorConfig implements AsyncConfigurer{
@Override
@Bean
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(20);//
taskExecutor.setMaxPoolSize(50);//
taskExecutor.setKeepAliveSeconds(8);// s
taskExecutor.setAwaitTerminationSeconds(3);// s
taskExecutor.initialize();//
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new ExceptionHandlingAsyncTaskExecutor();
}
}
하위 라인 이상 처리 방법을 정의합니다. 다중 라인이 실행될 때 하위 라인의 이상은 매번 출력되지 않습니다. 이 클래스를 설정해서 하위 라인의 이상을 출력해야 합니다.
@Component
@Configuration
public class ExceptionHandlingAsyncTaskExecutor implements AsyncUncaughtExceptionHandler{
private static final Logger logger = LoggerFactory.getLogger(ExceptionHandlingAsyncTaskExecutor.class);
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
logger.info("Method name - " + method.getName());
logger.info("Exception message - " + ex.getMessage());
for (Object param : params) {
logger.info("Parameter value - " + param);
}
}
}
부트 클래스에 설정 추가
@EnableAsync
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Async
@Async
@Override
public List getMbiIndex(CountDownLatch downLatch) {
downLatch.countDown();
}
: service ,
여기에 대상 CountDownLatch가 필요합니다.
// cout
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
//
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
//
public boolean await(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}
//
public void countDown() {
sync.releaseShared(1);
}
주된 방법
public Object mian(){
CountDownLatch downLatch= new CountDownLatch(3);
Future list1=test1(downLatch)
Future list2=test2(downLatch)
Future list3=test3(downLatch)
downLatch.await(4L, TimeUnit.SECONDS);
return list1.get();
}
Future test1(CountDownLatch downLatch){
.........
downLatch.countDown();
return new AsyncResult(new ArrayList());
}
테스트 2 () 와 테스트 3 () 도 이downLatch를 호출해야 합니다.countDown();