Java笔记之线程池

本文详细解析了Java线程池的四大优势,包括可复用线程提高性能,有效控制并发线程数,提供定时及周期性任务执行功能,并对比了newThread的弊端,如频繁创建对象导致性能下降、系统资源过度消耗等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、new thread的弊端
最近的项目中老是用到了线程,由于很习惯性的使用了Thread和handler,但是在网上浏览了一些文章博客后才发现。原来new Thread的弊端也是挺多的嘛。你的代码是否也和下面的一样呢?

        new Thread(new Runnable() {
            @Override
            public void run() {

            }
        }).start();

你每次执行的异步任务都是这样吗?so ,you are out,so do i。我发现了new Thread有如下的几个弊端:

①每次都要new thread,新建了一个对象,导致对象性能差。
②线程缺乏统一的管理,可以无限制的新建线程,相互之间竞争系统资源,导致占用的系统资源过多,最后造成了死机或者是OOM。
③缺乏更多的功能,比如定时执行、定期执行、线程中断。 

相比new Thread而言,Java提供的四种线程池的好处在于:

①可复用存在的线程,减少对象的创建、消亡,性能较高。
②有效控制并发线程数,提高了系统资源的使用率,避免了过多争夺系统资源,导致的堵塞。
③提供了定时执行、定期执行、单线程、并发数控制等功能。

2、Java线程池
Java通过Executors提供了四种线程池

newCachedThreadPool
创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,如无回收,则新建线程

        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            try {
                Thread.sleep(index * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();

                cachedThreadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(index);
                    }
                });
            }
        }

线程池为无限大,当执行第二个任务时第一个任务已经完成,就会重用第一个任务的线程,不用每次新建线程。

newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            final int index = i;
            fixedThreadPool.execute(
                    new Runnable() {
                        @Override
                        public void run() {
                            try {
                                System.out.println(index);
                                Thread.sleep(2000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block                
                                e.printStackTrace();
                            }
                        }
                    }
            );
        }

因为线程大小为3,每个任务输出index后休眠2秒,所以每两秒打印3个数字

newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行

        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        scheduledThreadPool.schedule(new Runnable() {    
            @Override    
            public void run() {        
                System.out.println("delay 3 seconds");    
            }
        }, 3, TimeUnit.SECONDS);

此表示为延迟3秒执行

        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        scheduledThreadPool.scheduleAtFixedRate(
                new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("delay 1 seconds, and excute every 3 seconds");
                    }
                }, 1, 3, TimeUnit.SECONDS);

此表示为延迟1秒后每3秒执行一次

newSingleThreadPool
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行

        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println(index);
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

结果依次输出,相当于顺序执行各个任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值