(推荐的使用方式:例如日历,每个日期要查询,查询参数不同,且互不影响的查询,可以用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);
}