为什么需要使用线程池:为了减少频繁创建线程与关闭线程的造成的资源占用
什么时候需要线程池:线程创建时间+销毁时间 > 执行时间
下面是实现代码
/**
* 线程池
* Created by zhoujingjie on 2016/4/8.
*/
public class ThreadPool {
private Worker[] workers;
//使用阻塞队列
private BlockingQueue<Runnable> tasks = new LinkedBlockingDeque<>();
public ThreadPool(int size) {
this.workers = new Worker[size];
}
public void execute(Runnable task){
tasks.add(task);
}
public void start(){
for(int i=0;i<workers.length;i++) {
workers[i] = new Worker();
workers[i].start();
}
}
public void destroy(){
for(Worker worker:workers){
worker.stopIt();
worker = null;
}
}
/**
* 工作执行者
*/
private class Worker extends Thread{
private boolean isRunning = true;
public void stopIt(){
isRunning =false;
}
@Override
public void run() {
while (isRunning){
try {
Runnable task=tasks.take();
task.run();
tasks.remove(task);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
原理:
预先创建一定数量的线程放入内存中形成线程池。
确保每个任务执行者不会被关闭,无任务执行时则线程阻塞(挂起)