并行查询的超时时间设置

众所周知,并行查询可以提高程序运行效率。主线程需要等待所有子线程把数据查询出结果,如果没有设置超时时间,就需要主线程就会一直阻塞到那里,从而占用服务器资源,那么如何设置超时时间呢?

1.在SpringBoot项目中引入线程池

java 复制代码
@EnableAsync
@Configuration
public class ThreadPoolsConfig {

    @Value("${AsyncTaskExecutor.corePooleSize:6}")
    private Integer corePooleSize;
    @Value("${AsyncTaskExecutor.maxPoolSize:15}")
    private Integer maxPoolSize;
    @Value("${AsyncTaskExecutor.queueCapacity:20000}")
    private Integer queueCapacity;

    /**
     * 自定义线程池
     */
    @Bean("myTaskExecutor")
    public AsyncTaskExecutor getMyTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setThreadNamePrefix("TaskThreadExec--");
        executor.setCorePoolSize(corePooleSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        // 放弃等待队列中最旧的任务来添加新的任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
        return executor;
    }

}

2.使用java.util.concurrent.CompletableFuture进行并行查询(未设置超时时间)

java 复制代码
        CompletableFuture[] asyncList = new CompletableFuture[]{
                CompletableFuture.runAsync(() -> queryDataA(), asyncTaskExecutor),
                CompletableFuture.runAsync(() -> queryDataB(), asyncTaskExecutor)
        };
        CompletableFuture.allOf(asyncList).join();

3.使用java.util.concurrent.CompletableFuture进行并行查询(设置超时时间)

java 复制代码
        CompletableFuture[] asyncList = new CompletableFuture[]{
                CompletableFuture.runAsync(() -> queryDataA(), asyncTaskExecutor),
                CompletableFuture.runAsync(() -> queryDataB(), asyncTaskExecutor)
        };

        try {
         	CompletableFuture.allOf(asyncList).get(3, TimeUnit.SECONDS);
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            System.err.println("多线程查询"+e.getMessage());
            Thread.currentThread().interrupt();
        }

需要说明的是,这里的interrupt方法也可以不调用。

interrupt方法的作用如下:

线程A在执行sleep,wait,join时,线程B调用线程A的interrupt方法,的确这一个时候A会有InterruptedException 异常抛出来。

但这其实是在sleep、wait、join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException

java 复制代码
import java.util.Date;

public class MyThread extends Thread{

    @Override
    public void run() {
        while (!isInterrupted()){
            System.out.println(new Date());
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        myThread.start();

        //1秒后打断子线程
        Thread.sleep(1000);
        myThread.interrupt();
    }
}
相关推荐
B站计算机毕业设计超人19 分钟前
计算机毕业设计制造业MES生产管理平台 MES 生产制造源码+文档+运行视频+讲解视频)
java·spring boot·mysql·eclipse·tomcat·maven·web
技术咖啡馆C1 小时前
二、通义灵码插件保姆级教学-IDEA(使用篇)
java·intellij-idea·通义灵码·ai助手·idea-plugin
星星点点洲1 小时前
【SpringBoot实现全局API限频】 最佳实践
java·spring boot·后端
华梦岚1 小时前
F#语言的学习路线
开发语言·后端·golang
linwq82 小时前
Java网络编程学习(一)
java·网络·学习
lllsure2 小时前
【快速入门】SpringMVC
java·后端·spring·mvc
翻晒时光2 小时前
24、深入理解与使用 Netty:Java 高性能网络编程的利器
java·网络
lly2024062 小时前
XML 元素:结构化数据的基石
开发语言
钟离墨笺2 小时前
【c++】四种类型转换形式
开发语言·c++
“抚琴”的人2 小时前
【C#零基础从入门到精通】(一)——了解C#
开发语言·c#