线程、线程池太难?不理解?
没关系,这里我都给你写好了,拿去用就行,随便挑随便选!
package thread.threadPool;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* @ClassName: ThreadPool
* @Description:
* 1、创建线程池的四种方法:Thread、Runnable、Executors、ThreadPoolExecutor创建
* 2、线程主要是用子在查询,而不是增删改,多线程本来就是互相抢占资源,所以新增的话会导致数据库出现很多脏数据(重复数据)
* 3、对于请求相应时间比较长,对于系统资源占用率高的情况下使用多线程
* 4、下列多线程只适合在单体项目中!!!
* @Author: TXW
* @Date: 2023/2/2
*/
public class ThreadPool{
/**
* 线程名称: 传统创建线程池
* 使用场景:查询请求捉着处理请求响应时间比较慢的情况下使用线程
* 注意事项:没有节制的new对象,某一个时间段内大量请求,可能会导致OOM的现象
* */
private List<Object> threadMethod() throws ExecutionException, InterruptedException {
FutureTask<List<Object>> task = new FutureTask<List<Object>>(new Callable() {
@Override
public List<Object> call() throws Exception {
// 这里面写业务逻辑或者请求接口
List<Object> objects = new ArrayList<>();
return objects;
}
});
Thread thread = new Thread(task);
thread.start();
return task.get();
}
/**
* 线程名称:指定线程数量的线程池
* 使用场景:请求相应时间长,对请求的频率有一定的掌握
* 注意事项:设置太小会导致线程阻塞的情况,设置太大会导致资源浪费,需要合理配置
* */
private void threadPoorFixedMethod(){
ExecutorService service = Executors.newFixedThreadPool(5);
FutureTask<List<Object>> task = new FutureTask<List<Object>>(new Callable() {
@Override
public List<Object> call() throws Exception {
return null;
}
});
service.submit(task);
// service.execute(new Runnable() {
// @Override
// public void run() {
// //只能执行无返回值的方法
// }
// });
}
/**
* 线程名称:定时线程池
* 使用场景:自某一段时间内需要执行任务,时间自行设置
* 注意事项:请求队列允许创建最大长度为Integer.MAX_VALUE,可能会累集大量请求导致OOM现象
* */
private void scheduleExecutorMethod(){
ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
FutureTask<List<Object>> task = new FutureTask<List<Object>>(new Callable() {
@Override
public List<Object> call() throws Exception {
return null;
}
});
// 第一种使用方法
service.schedule(task,10,TimeUnit.MINUTES); //延迟10分钟执行
// 第二种使用方法
service.scheduleAtFixedRate(task,5,10,TimeUnit.SECONDS); //5秒钟后执行任务,每隔10秒钟执行下个任务 (如果如果任务大于设置时间,那么会将执行时间作为频段执行)
}
/**
* 使用场景:缓存线程池具有缓存的功能,默认过期时间是60秒,后清空
* 注意事项:允许创建最大线程数量Integer.MAX_VALUE,导致出现OOM现象,
* */
private Integer cacheThreadPoolMethod(){
ExecutorService cached = Executors.newCachedThreadPool();
FutureTask<List<Object>> task = new FutureTask<List<Object>>(new Callable() {
@Override
public List<Object> call() throws Exception {
return null;
}
});
cached.submit(task);
}
/**
* 线程名称:自定义侠女恒池
* 使用场景:目前比较推荐的一个线程池创建方法,所有的数据由自己根据系统需要进行设置
* 注意事项:所有参数可点击该对象查看源码了解各个参数的功能和作用,需要合理设置参数值
* */
private void threadPoolExecutorMethod(){
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,
10,
30,
TimeUnit.MINUTES,
new LinkedBlockingDeque<Runnable>(100));
FutureTask<List<Object>> task = new FutureTask<List<Object>>(new Callable() {
@Override
public List<Object> call() throws Exception {
return null;
}
});
threadPoolExecutor.submit(task);
}
}