线程的优化
原因
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,启动线