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);
    }

猜你喜欢

转载自blog.csdn.net/weixin_43329956/article/details/121142122