线程池常用参数:
线程池工作流程
自定义参数设计
corePoolSize 核心线程数量
根据每个任务的处理时间s和每秒产生的任务量m以及处理任务要求时间t来确定,如任务处理时间为0.1秒,系统80%时间内每秒产生100个任务,如需在1秒内处理完100个任务,则需要10个核心线程。计算公式:m*s/t
workqueue 任务队列长度
核心线程数量/每个任务处理所需时间*2
maximumPoolSize 最大线程数量
(最大任务数量-队列长度)* 每个任务处理所需时间
keepAliveTime 最大保活时间
根据系统运行环境和硬件压力设定,没有固定参考值
自定义线程池实现步骤
具体代码
1、 MyTask
public class MyTask implements Runnable{
private int id;
public MyTask(int id) {
this.id = id;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println("线程"+name+"即将运行任务"+id);
try {
Thread.sleep(200l);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+name+"完成了任务"+id);
}
@Override
public String toString() {
return "MyTask{" +
"id=" + id +
'}';
}
}
2、 MyWorker
public class MyWorker extends Thread{
private List<Runnable> task;
public MyWorker(String name, List<Runnable> task) {
super(name);
this.task = task;
}
@Override
public void run() {
while (task.size()>0){
Runnable r = task.remove(0);
r.run();
}
}
}
3、 MyThreadPool
public class MyThreadPool {
private List<Runnable> task = Collections.synchronizedList(new LinkedList<Runnable>());
private int num;//当前任务数量
private int corePoolSize;
private int workSize;
private int maxSize;
public MyThreadPool(int corePoolSize, int workSize, int maxSize) {
this.corePoolSize = corePoolSize;
this.workSize = workSize;
this.maxSize = maxSize;
}
public void submit(Runnable r){
if(task.size()>=workSize){
System.out.println("任务"+r+"被丢弃了");
}else {
task.add(r);
execTask(r);
}
}
private void execTask(Runnable r) {
if (num<corePoolSize){
new MyWorker("核心线程"+num,task).start();
num++;
}else if(num < maxSize){
new MyWorker("非核心线程"+num,task).start();
num++;
}else {
System.out.println("任务"+r+"被缓存了");
}
}
}
4、 MyTest
public class MyTest {
public static void main(String[] args) {
MyThreadPool pool = new MyThreadPool(2,4,6);
for (int i = 0; i <15 ; i++) {
MyTask my = new MyTask(i);
pool.submit(my);
}
}
}