CompletableFuture implementa asíncrono y bloques para obtener el resultado de retorno, use hábilmente el valor de retorno de CompletableFuture para resolver cuellos de botella de rendimiento, grupo de subprocesos, disposición asíncrona
Referencia: https://blog.csdn.net/LUOHUAPINGWIN/article/details/122222011
https://blog.csdn.net/sunquan291/article/details/103991184
Colocación:
gulimall.thread.coreSize=20
gulimall.thread.maxSize =200
guilimall.thread.keepAliveTime=10
Leer configuración:
paquete com.xunqi.gulimall.order.config;
importar lombok.Datos;
importar org.springframework.boot.context.properties.ConfigurationProperties;
/ **
* @Descripción: * @Creado :
con IntelliJ IDEA .
@ConfigurationProperties(prefijo = "gulimall.thread")
// @Component
@Data
public class ThreadPoolConfigProperties {
tamaño de núcleo privado entero;
Tamaño máximo de número entero privado;
privado Entero keepAliveTime;
}
Grupo de subprocesos de inyección:
paquete com.xunqi.gulimall.order.config;
importar org.springframework.boot.context.properties.EnableConfigurationProperties;
importar org.springframework.context.annotation.Bean;
importar org.springframework.context.annotation.Configuration;
importar java.util.concurrent.Executors;
importar java.util.concurrent.LinkedBlockingDeque;
importar java.util.concurrent.ThreadPoolExecutor;
importar java.util.concurrent.TimeUnit;
/**
* @Descripción: clase de configuración del grupo de subprocesos
* @Creado: con IntelliJ IDEA
* @autor: Xia Mo Zhishui
* @createTime: 2020-06-23 20:24
**/
@EnableConfigurationProperties(ThreadPoolConfigProperties.class)
@Configuration
public class MyThreadConfig {
@Bean
public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool) { devuelve nuevo ThreadPoolExecutor( pool.getCoreSize(), pool.getMaxSize(), pool.getKeepAliveTime(), TimeUnit.SECONDS, new LinkedBlockingDeque<>(100000), Executors.defaultThreadFactory(), nuevo ThreadPoolExecutor.AbortPolicy() ); }
}
Uso:
@Autowired
privado ThreadPoolExecutor threadPoolExecutor;
@Override
public List<WxUserInfo> getWxUserInfoByUid(String appid, List<Long> uidList) { // Demasiados datos Fragmento de ejecución List<List<Long>> uidListGroupList = CollectionUtil.split(uidList, 500);
List<FuturoCompletable<Lista<WxUserInfo>>> futuros = uidListGroupList.stream().map(lista -> { return CompletableFuture.supplyAsync(() -> { RestResult<List<WxUserInfo>> wxUserInfoByAppIdUid = pasaporteFeignService.getWxUserInfoByAppIdUid(appid, list , appName); return wxUserInfoByAppIdUid.getData(); }, threadPoolExecutor); }).collect(Collectors.toList());
// List<WxUserInfo> collect = futures.stream().map(p -> { // try { // return p.get(); // } catch (InterruptedException e) { // e.printStackTrace(); // } catch (ExecutionException e) { // e.printStackTrace(); // } // devuelve nulo; // }).filter(Objects::nonNull).flatMap(List::stream).collect(Collectors. Listar());
List<WxUserInfo> biddingList = futures.stream().map(CompletableFuture::join).filter(Objects::nonNull).flatMap(List::stream).collect(Collectors.toList());
volver lista de ofertas;
}