多线程不懂也会使用的方法

本文介绍了Java中创建线程池的四种方法,包括Thread、Runnable、Executors和ThreadPoolExecutor。强调了线程池在查询场景和资源占用高的情况下的使用,以及不同线程池类型的适用场景和注意事项,如固定线程池防止阻塞,定时线程池进行定时任务,缓存线程池的资源管理问题,以及自定义线程池的灵活性。
摘要由CSDN通过智能技术生成

线程、线程池太难?不理解?

没关系,这里我都给你写好了,拿去用就行,随便挑随便选!

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


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值