学习Java20天线程的优化

线程的优化

原因

1,一个线程大约占1MB的内存空间

2,一个线程在执行完线程任务后,等待被JVM回收

问题情况: 2000个线程在下载2000个文件

        优化: 用少量的线程执行多个任务

        5个线程下载2000个文件 涉及的内容:

                1,线程的复用

                 2,线程的创建

                3,线程的销毁

                4,线程的管理

Excruor线程池

是JDK提供的接口

线程池:管理线程的容器

作用:

         1,线程的复用

        2,线程的创建

         3,线程的销毁

         4,线程的管理

使用线程后:只需关心给线程池中如何添加任务.至于如何实现线程的复用,创建,销毁,管理都由线程池内部解决

线程池的体系

    体系结构:

        Executor(接口)

                 ExecutorService(接口)

                        ThreadPoolExecutor(类)

                                ScheduledThreadPoolExecutor(类)

Executor提供的方法

        void execute(Runnable command):执行线程任

ExecutorService提供的方法:

        void shutdown():关闭线程池

                       不会阻塞当前线程

                        在所有线程池置信那个完毕后关闭

                        当使用调度线程池执行重复任务会直接关闭线程池

         boolean isShutdown():判断线程池是否关闭

        Future submit(Runnable task):提交线程任务

         Future submit(Callable task):提交线程任务

                        future 是Callable的返回值类型

注意:因为ExecutorService提供了submit方法所以可以不用使用Executor提供的execute方法

使用:

1,创建线程池对象

2,提交线程任务给线程池

3,关闭线程池                 

                

ThreadPoolExecutor创建线程对象过于复杂,所以JDK提供了Executors(线程池创建工具类),让程序员方 便创建线程池对象

原因:在白皮书中,有说,为了让大家深刻的理解线程池,建议大家使用ThreadPoolExecutor创建线程池对象

如何创建ThreadPoolExecutor对象(了解

        ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

参数:

corePoolSize:核心线程数量(当前线程池中最少必须要保证有多少个线程)

maximumPoolSize:最大线程数量(当前线程池中最多有多少个线程)

keepAliveTime:销毁时间(多长时间内容,线程没有任务,才会被销毁)

unit:时间单位

workQueue:线程任务队列

threadFactory:线程工厂(创建线程)

handler:复用的算法机制

Executors:线程池创建工具类

作用:创建线程池

分类: 创建固定线程池

         特点:线程池中线程数量恒定

创建可变线程池

        特点:线程池中线程数量不定

创建单例线程池

        特点:线程池只有一个线程

创建调度线程池

        特点:线程任务可以重复执行,也可以延迟执行,线程数量有最小数,但是没有最大值

创建单例调度线程池

        特点:线程任务可以重复执行,也可以延迟执行,线程数量为1

创建抢占线程池(了解)

        特点:抢占算法

 

ScheduledThreadPoolExecutor的特有方法

ScheduledFuture schedule(线程任务对象,延迟时间, 时间单位); 提交线程任务,延迟执行

ScheduledFuture scheduleAtFixedRate(线程任务对象,延迟时间, 间隔时间,时间单位)

      提交线程任务,延迟执行,间隔多久后重复执行 间隔时间:上一次开始时间与下次任务开始时间,如果上次任务执行时间大于间隔时间,那么下次任务,是 等上次任务结束后直接执行

ScheduledFuture scheduleWithFixedDelay(线程任务对象,延迟时间, 间隔时间,时间单位);

提交线程任务,延迟执行,间隔多久后重复执行 间隔时间:上一次结束时间与下次任务开始时间

线程任务的优化

Callable

意义:一个线程任务 与Runnable的区别:

        1,Runnable可以在Thread中使用也可以在线程池中直接使用

        2,Callable只能在线程池中直接使用

        3,Runnable的run方法没有返回值,传递子线程中运行结果

         4,Callable的call方法有返回值,可以将子线程的运行结果返回 案例: 使用两个线程分别计算1~50的和与100~150的和,求其总和

锁的优化

Lock(接口)

        ReentrantLock(类)

        ReentrantReadWriteLock 实现了ReadWriteLock接口

Lock提供的方法:

        void lock():上锁

        void unlock():解锁

  ReadWriteLock接口提供的方法

         Lock readLock():获取读的锁

        Lock writeLock():获取写的锁

读与读异步(不互斥)

读与写同步(互斥)

写与写同步(互斥)

设计模式(生产者与消费者设计模式

作用:描绘工厂的生产与销售

        分析:

                对象: 厂

                         剩余商品数量

                        最大可容纳商品数量

                        生产的方法

                        销售的方法

                生产人员

                        死循环 生产

                销售人员

                        死循环 销售

        类:

        工厂类

                属性: 剩余商品数量 最大可容纳商品数量

                方法:

                        生产的方法,一个线程安全的方法

                                步骤: 1,判断剩余商品数量小于最大可容纳商品数量 剩余商品数量++ 提示:谁谁谁生产了一个产品,现在还有xxx个商品 唤醒消费线程

                                         2,剩余商品数量大于等于最大可容纳商品数量 唤醒消费线程 提示:仓库已满,生产人员xxx休息 休眠当前线程

                        销售的方法,一个线程安全的方法

                                步骤: 1,判断剩余商品数量大于0 剩余商品数量-- 提示:谁谁谁卖出一个产品,现在还有xxx个商品 唤醒生产者线程

                                          2,剩余商品数量小于等于0 唤醒生产者线程 提示:已经无货,销售人员xxx休息 休眠当前线程

         

        生产任务类

               死循环调用生产方法 注意:生产任务与销售任务对象的所有的工厂对象为一个对象

        销售任务类

                死循环调用销售方法 注意:生产任务与销售任务对象的所有的工厂对象为一个对象

        环境类

                先写main方法 步骤:

                        1,创建工厂

                        2,创建生产任务,传入工厂

                        3,创建销售任务,传入工厂

                        4,创建生产人员 创建生产人员对象(线程对象),传入生产任务对象 创建生产人员对象(线程对象),传入生产任务对象 创建生产人员对象(线程对象),传入生产任务对象 创建生产人员对象(线程对象),传入生产任务对象 创建生产人员对象(线程对象),传入生产任务对象 ...

                        5,创建销售人员 创建销售人员对象(线程对象),传入销售任务对象 ...

                        6,启动线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值