线程池的学习

线程池

线程

1.线程的生命周期、开始、运行、结束
2.多线程调用start、run方法
运行这段代码

public static void main(String[] args) throws InterruptedException   {
        Long start = System.currentTimeMillis();
        final Random random = new Random();
        final List<Integer> list = new ArrayList<>();
        for (int i =0;i< 100000;i++){
            Thread thread = new Thread(){

                public  void  run(){
                    list.add(random.nextInt());
                }
            };
            thread.start();;
            thread.join();


        }

        System.out.println("time:"+(System.currentTimeMillis()-start));
        System.out.println("size:"+list.size());
    }

我的电脑的输出结果是:time:31283
size:100000 ,这是使用线程来跑。

使用线程池后

public static void main(String[] args) throws InterruptedException   {
        Long start = System.currentTimeMillis();
        final Random random = new Random();
        final List<Integer> list = new ArrayList<>();
        //初始化一个java自带的线程池

        /*
        * Executors  工具类,三种实现线程池的方式
        *
        * */
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i =0;i< 100000;i++){
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                        list.add(random.nextInt());

                }
            });
        }
        executorService.shutdown();

        executorService.awaitTermination(1, TimeUnit.DAYS);
        System.out.println("time:"+(System.currentTimeMillis()-start));
        System.out.println("size:"+list.size());
    }

输出:
time:225
size:100000

核心方法的参数如下
参数理解

假设设定核心数是10 ,最大核心数是20,任务有30个,它的工作是30个。运行流程如下,也是面试点。
在这里插入图片描述

在线程执行任务时:三个方法分别调用不同分配方式的核心线程和非核线程,具体的情况就不在这描述。

三种三种线程运行方式都是以这些参数为基础。

1.newCachedThreadPool 最快
在这里插入图片描述

2.newFixedThreadPool 慢
在这里插入图片描述

3.newSingleThreadExecutor 最慢

在这里插入图片描述
注意线程复用:一个线程可以干多个任务,所以还是根据任务场景不同来具体分析。


但是以上三种方法阿里巴巴的开发手册都不建议使用。为什么?
因为线程无限。
newfix是什么问题?他是无界的,浪费内存,极限情况下回出现oom问题;
newcached呢?它默认是work是最大,会浪费线程,会使cpu负载过大。
newSingle呢?和newfix是一样的道理,浪费内存。

=========================================================
那推荐什么呢?
自定义线程。
根据任务情况自定义线程,设定核心数,最大线程数,

那为什么线程池快,而线程运行慢吗?
我也不懂。正在搜索资料。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的程序员1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值