springboot 우아 한 스 레 드 풀 사용
정의 실행 자
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.*;
@Slf4j
@Configuration
public class AsyncThreadPoolConfiguration {
// CPU
private int maximumPoolSizePerCPU;
//
private int blockingCapacity;
@Bean
public Executor asyncExecutor() {
// CPU
int cpuCores = Runtime.getRuntime().availableProcessors();
//fixed thread pool (core == max)
return new ThreadPoolExecutor(
maximumPoolSizePerCPU * cpuCores,
maximumPoolSizePerCPU * cpuCores,
0,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(blockingCapacity),
new FirstInFirstRejectPolicy());
}
private class LogRejectPolicy implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
log.warn("reject a task");
}
}
//
private class FirstInFirstRejectPolicy implements RejectedExecutionHandler {
public FirstInFirstRejectPolicy() {
}
/**
* Obtains and ignores the next task that the executor
* would otherwise execute, if one is immediately available,
* and then retries execution of task r, unless the executor
* is shut down, in which case task r is instead discarded.
*
* @param r the runnable task requested to be executed
* @param e the executor attempting to execute this task
*/
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
//warn
log.warn("reject first task of queue");
//exec
e.execute(r);
}
}
}
}
새 작업 클래스
import org.springframework.stereotype.Component;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.function.Function;
/**
* Copyright© 2019
*
* @author yuhui.xie
* @date 2019/11/1
*/
@Component
public class AsyncTask {
private final Executor asyncExecutor;
public AsyncTask(Executor asyncExecutor) {
this.asyncExecutor = asyncExecutor;
}
public void run(Runnable runnable) {
CompletableFuture.runAsync(runnable, asyncExecutor);
}
public void run(Runnable runnable, Function<Throwable, ? extends Void> exceptionHandler) {
CompletableFuture.runAsync(runnable, asyncExecutor).exceptionally(exceptionHandler);
}
public void submit(Runnable runnable) {
asyncExecutor.execute(runnable);
}
}
쓰다
asyncTask.run(() ->
//TODO
));
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 다 중 스 레 드 메커니즘 의 스 레 드 생 성target 을 실행 대상 으로 지정 한 name 을 이름 으로 하고 group 에서 참조 하 는 스 레 드 그룹의 일원 으로 새 Thread 대상 을 할당 합 니 다. 이 스 레 드 가 독립 된 Runnable 실...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.