springboot-java 多线程 使用线程池

(推荐的使用方式:例如日历,每个日期要查询,查询参数不同,且互不影响的查询,可以用for循环创建线程去查)

使用方法

1.ThreadBean.java - 自动注入配置类

放config文件夹下(有component注解,会自动注入的)

package com.mods.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * 在线程中注入bean
 */
@Component
public class ThreadBean implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ThreadBean.applicationContext = applicationContext;
    }
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }
    public static <T> T getBean(Class<T> clz) throws BeansException {
        return (T) applicationContext.getBean(clz);
    }
}
2.封装调用的方法

具体线程中调用的方法,算业务,放到service包下,创建一个新的包thread
测试:(方法一和方法二代码相同,只是改了个名字)

package com.mods.service.thread;

import com.mods.config.ThreadBean;
import com.mods.mbg.mapper.DownloadwarningMapper;

import java.util.Map;

public class TestThread1 implements Runnable {
    private DownloadwarningMapper downloadwarningMapper;
    private Map<String, Object> map;
    public TestThread1(Map<String, Object> map) {
        this.map = map;
    }
    @Override
    public void run() {
        //通过封装方法注入bean
        downloadwarningMapper = ThreadBean.getApplicationContext().getBean(DownloadwarningMapper.class);
        //改变传入的值,(指向的是同一空间,改变即返回)
        this.map.put("方法一返回", downloadwarningMapper.selectList(null));
    }
}
3.在业务层代码中调用

这边建议就是先add到list中,然后get下标取出,用线程去改,否则可能出现值未改变的情况(或者在线程结束后去赋完值再add进去,我没想到怎么做)

    public Result threadTest() throws InterruptedException {
        List<Map<String, Object>> data = new ArrayList<>();
        ExecutorService executor = Executors.newCachedThreadPool();//实例化线程池对象
        Map<String, Object> map1 = new HashMap<>();
        data.add(map1);
        executor.execute(new TestThread1(data.get(0)));//多线程 方法1对空的map1赋值
        Map<String, Object> map2 = new HashMap<>();
        data.add(map2);
        executor.execute(new TestThread2(data.get(1)));//多线程 方法2对空的map2赋值
        executor.shutdown();//关闭线程池的连接

//        while (true) {
//            if (executor.isTerminated()) {//一直while循环等待结束
//                break;
//            }
//        }
		executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES); //设置最大时间,等待线程结束

        return new Result(data);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值