一 线程池的构成
二 线程池的执行流程
三 线程池用的设计模式
享元设计模式
概念 如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象。目的是提高系统性能。
当然,享元模式也借用了单例模式
享元的主要组成:
(1)享元工厂(Llibrary):用于创建具体享元类,维护相同的享元对象。当请求对象已经存在时,直接返回对象,不存在时,在创建对象。在例子中的解释就是图书馆,保存了所有的书,当学生借书时,有就拿走,没有买一本新书。这里面其实是使用了单例模式的。
(2)抽象享元(Book):定义需要共享的对象业务接口。享元类被创建出来总是为了实现某些特定的业务逻辑.
(3)具体享元(ConcreteBook):实现抽象享元类的接口,完成某一具体逻辑。在这里表示可以被借出。
四 线程池模拟实现代码:
public class ThreadPoolTest {
public static void main(String[] args) {
//核心线程池
int corePoolSize=2;
//最大容量的线程池
int maximumPoolSize=4;
//线程的最大空闲时间
long keepAliveTime=30;
//时间单位
TimeUnit unit=TimeUnit.SECONDS;
//任务队列
BlockingQueue<Runnable> workQueue=new ArrayBlockingQueue<Runnable>(1);
//定义拒绝策略
RejectedExecutionHandler handler=
//当池无法处理这个任务时,由任务启动方去执行任务
new ThreadPoolExecutor.CallerRunsPolicy();
//构建线程工厂,可以给线程起个名字
ThreadFactory factory=new ThreadFactory() {
//线程名前缀
private String namePrefix="线程池-";
//构建一个线程安全的原子自增自减对象
private AtomicLong atomicLong= new AtomicLong(1);
@Override
public Thread newThread(Runnable r) {//r 为任务
return new Thread(r,namePrefix+atomicLong.getAndIncrement());
}
};
//创建线程
ThreadPoolExecutor pool =
new ThreadPoolExecutor
(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,factory,handler);
for(int i=0;i<6;i++){
pool.execute(new Runnable() {
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name+"任务1");
try{Thread.sleep(1000);}catch (Exception e){};
}
});
}
pool.shutdown();//不再接收任务,等现有任务执行结束将池关掉
}
}
使用了堵塞队列:满了进不去,空了取不出来