咱們首先實現一個能簡單執行任務的線程池,很明顯,這樣的線程池須要具有兩個要素,一個是工做線程,一個是任務隊列ide
//工做線程
private List<Thread> workers;
//任務隊列
private final BlockingQueue<Runnable> taskQueue;
複製代碼
工做線程用於執行具體的每個任務,而任務隊列負責接收要執行的任務。this
線程池實例化的時候,肯定線程池工做線程個數poolSize和最大容許接受任務的個數maxAcceptspa
public MyThreadPool(int poolSize, int maxAccept) {
workers = new ArrayList<>(poolSize);
taskQueue = new ArrayBlockingQueue<>(maxAccept);
this.poolSize = poolSize;
this.maxAccept = maxAccept;
}
複製代碼
工做線程在線程池的初始化方法中建立和啓動線程
public synchronized void init() {
if(!inited) {
for (int i = 0; i < this.poolSize; i++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
//從任務隊列中取任務,而後執行
Runnable runnable = taskQueue.take();
runnable.run();
} catch (InterruptedException e) {
}
}
}
});
workers.add(t);
t.start();
}
} else {
return;
}
inited = true;
}
複製代碼
線程池對外提供執行任務的方法code
public void execute(Runnable runnable) throws RejectException{
if(this.taskQueue.size() < maxAccept) {
this.taskQueue.add(runnable);
} else {
//線程池任務隊列滿了,拋出拒絕異常
throw new RejectException();
}
}
複製代碼
實例化線程池,並調用生命週期
public static void main(String[] args) {
MyThreadPool myThreadPool = new MyThreadPool(5,50);
myThreadPool.init();
try {
myThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println("任務被執行了");
}
});
} catch (MyThreadPool.RejectException e) {
}
}
複製代碼
以上,咱們實現了一個最簡單的線程池隊列
按照咱們上一章中提到的,一個完備的線程池除了任務的執行以外,還應該具有如下條件string
顯然,本例子中,並無完整地體現線程和線程池的生命週期,咱們實現的還有缺陷,下一章針對本部分進行完善。it