线程的优化
线程优化:线程池
一个线程大约占1MB的 内存,大量创建线程,会占据大量内存,导致程序卡顿,甚至出现内存溢出异常
线程使用完毕后,等待GC回收,没有回收的时候,还在占据空间
频发创建与销毁内存,会浪费CPU
代码冗余
线程池简介:
(一个负责创建,销毁,复用的容器)
使用线程池后,不用关心线程的创建,销毁,复用等情况,
线程池体系结构:
Executor(接口)
提供的方法:
execute(Runnable command);//执行线程任务
ExecutorServer(子接口)
提供的方法:
submit(Runnable task);//提交线程任务.
shutdown();//关闭线程池
isshutdown();//判断是否关闭线程池
isTerminated();//判断线程是否在执行
AbstractExecutorSrever(子类,抽象类)
ThreadPoolExecutor(子类,可以创建对象)
ScheduleExecutorServer(子接口,调度线程池)
提供的方法:
schedule();//
scheduleAtFixedRate()
ThreadPoolExecutor的构造函数:
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数含义:
corePoolSize:核心线程数量,即线程中最少有几个线程
maximumPoolSize:线程池最大线程数量
keepAliveTime:销毁时间,空闲线程多久没有时间被销毁,不会销毁核心线程
unit:时间单位
workQueue:存放线程任务的队列
threadFactory:线程工厂
handler:复用机制与算法
线程任务优化
线程任务优化原因:
Runnable没有返回值,无法将run中算结果传递传递出来
思路:
使用Callable,解决没有返回值问题
Callable:一个有返回值的线程任务;
1.创建Callable对象,提交给线程任务;
语法:
2.Future<返回值> f=使用线程池对象.submit(线程任务);
3.获取返回值
返回的数据类型 返回值 = f.get();
get()会阻塞当前线程,知道对应线程执行完并且获取到的结果.
注意:
不能配合Thread使用;
只能使用线程池
锁的优化
原因:
synchronized会导致代码结构混乱,
思路
使用LOCK接口
lock();关锁
unlock();解锁
newCondition();创建锁对象
子类:
ReentrantLock(互斥锁)
Condition:锁对象
void await();//休眠
void signal();//唤醒一个
void signal();//唤醒所有
ReadWriteLock(读写锁):
Lock readLock():获取读的锁对象
Lock writeLock();获取写的锁对象
子类ReentrantReadWriteLock
读与读:异步
读和写:同步
写与写:同步