为什么要用线程池?
1、降低资源的消耗。降低线程创建和销毁的资源消耗;
2、提高响应速度:线程的创建时间为T1,执行时间T2,销毁时间T3,免去T1和T3的时间
3、提高线程的可管理性。
线程池模型
我们不妨动手写一个线程池,主要有以下几个核心概念,阻塞队列中待执行的任务,线程正在执行的任务,线程数。
package com.xiangxue.ch6.mypool;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* 测试写一个线程池
*/
public class LeeThreadPoll {
private static int WORK_NUM = 5;//池子中可以执行的线程个数,初始参数
private static int QUENE_COUNT = 100;//阻塞队列中允许传入的任务个数,初始参数
private WorkThread[] workThreads;//池子中等待运行的线程
private BlockingQueue<Runnable> queue;
;//阻塞队列中等待运行的任务
private int workerNum;//池子中可以执行的线程个数,
private int queneCount;//阻塞队列中允许传入的任务个数,
//池中的线程
private class WorkThread extends Thread {
@Override
public void run() {
Runnable r = null;
try {
while (!interrupted()) {
r = queue.take();//获取需要执行的任务
if (r != null) {
System.out.println(getId() + " ready exec :" + r);
r.run();
}
r = null;//为了帮助gc
}
} catch (InterruptedException e) {
}
}
public void stopWorker() {
//中止线程
interrupt();
}
}
//构造方法
// 创建线程池,worker_num为线程池中工作线程的个数
public LeeThreadPoll(int worker_num, int taskCount) {
if (worker_num <= 0) worker_num = WORK_NUM;
if (taskCount <= 0) taskCount = QUENE_COUNT;
this.workerNum = worker_num;
queue = new ArrayBlockingQueue<>(taskCount);
workThreads = new LeeThreadPoll.WorkThread