线程池的设计思路是:
1.在线程池类准备一个任务容器list,里面用于存放任务线程
2.在线程池类的构造方法中初始化若干个执行线程(用来执行任务容器里的任务),刚开始任务容器list是空的,所以让执行线程wait
3.线程池类有个add(Runable task)方法,用于加入任务线程,当加入任务线程时,list不为空,此时notifyAll执行线程
4.执行线程从任务容器中取出任务线程,执行任务
package test;
import java.util.LinkedList;
public class ThreadPool {
//初始化线程的数量
private int threadSize = 10;
//任务容器
LinkedList<Runnable> list = new LinkedList<Runnable>();
//start这10个消费者线程
public ThreadPool(){
for (int i = 0; i <threadSize; i++) {
new ExecuteTask("执行线程 " + i).start();
}
}
//把任务加入任务容器,并唤醒执行线程来执行任务
public void add(Runnable task){
synchronized (list) {
list.add(task);
list.notifyAll();
}
}
//执行任务的线程
class ExecuteTask extends Thread{
Runnable task;
public ExecuteTask(String name){
super(name);
}
public void run(){
System.out.println("启动" + this.getName());
while(true){
synchronized (list) {
while(list.isEmpty()){
//允许增加任务线程执行增加任务
try {
list.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//取出一个任务
task = list.removeLast();
//允许增加任务线程执行增加任务
list.notifyAll();
}
System.out.println(this.getName() + "执行任务");
//执行任务
task.run();
}
}
}
}
package test;
public class Test {
public static void main(String[] args) {
ThreadPool pool = new ThreadPool();
while(true){
Runnable task = new Runnable(){
public void run(){
System.out.println("----任务 执行----");
}
};
pool.add(task);
}
}
}