JAVA线程池核心知识点详解
下文笔者讲述Java线程池的核心参数说明,如下所示
线程池定义时--七大参数指哪些呢?
线程池有哪些状态呢?
创建线程池有哪几种方式呢?
线程池的优点简介说明
线程池中submit()和execute()方法有什么不同呢?
java 中如何运用线程池呢?
线程池的简介说明
Java如何自定义线程池(ThreadPoolExecutor)呢?
核心线程数量corePoolSize
核心线程数的设计: 根据任务的处理时间和每秒产生的任务数量来确定 例 执行一个任务需要0.1秒,系统百分之八十的时间没秒都会产生100个任务 那么我们想要在1秒内处理完这100个任务,就需要10个线程 此时我们就可以设计核心线程数量为10, 当时实际情况不可能这么平均, 所以一般我们按照2080原则设计即可 即按照百分之80的情况设计核心线程数量 剩下的百分之20可以利用最大线程数量处理
任务队列长度(workQueue)
任务队列长度: 一般设计为核心线程数/单个任务执行时间*2(任务最大等待时间/s)即可 例: 上面场景中,核心线程数设计为10 单个任务执行时间为0.1,则队列长度可以设计为200
最大线程数(maximumPoolSize)
最大线程数的设计: 除需要参照核心线程数的条件外, 还需要参照系统每秒产生的最大任务数决定 例: 如果系统每秒最大产生的任务数量是1000个 那么最大线程数=(最大任务数-任务队列长度)* 单个任务执行时间 即:最大线程数=(1000-200)* 0.1 =80; 当然最大线程数和服务器的硬件配置也有很大关系
定义线程池
模拟任务类
package com.java265;
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(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程:" + name + "完成了任务:" + id);
}
@Override
public String toString() {
return "MyTask{" +
"id=" + id +
'}';
}
}
自定义线程类
package com.java265; import java.util.Arraylist; import java.util.List; public class MyWorker extends Thread { private String name; private List<Runnable> tasks = new ArrayList<>(); public MyWorker(String name, List<Runnable> tasks) { super(name); this.tasks = tasks; } @Override public void run() { while (tasks.size() > 0) { Runnable r = tasks.remove(0); r.run(); } } }
自定义线程池类
package com.java265;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class MyThreadPool {
/**
* 任务集合 多个线程同时remove
*/
private List<Runnable> tasks = Collections.synchronizedList(new LinkedList<>());
/**
* 当前先测试数量
*/
private int num;
/**
* 核心线程数量
*/
private int coreThreadSize;
/**
* 最大线程数量
*/
private int maxThreadSize;
/**
* 队列长度
*/
private int workSize;
public MyThreadPool( int coreThreadSize, int maxThreadSize, int workSize) {
this.coreThreadSize = coreThreadSize;
this.maxThreadSize = maxThreadSize;
this.workSize = workSize;
}
public void submitTask(Runnable r) {
if (tasks.size() >= workSize) {
System.out.println("任务" + r + "丢掉了");
} else {
//加入队列
tasks.add(r);
//执行队列
execTask(r);
}
}
private void execTask(Runnable r) {
//判断是否需要创建核心线程池
if (num < coreThreadSize) {
//创建核心线程池执行
new MyWorker("核心线程池" + num, tasks).start();
num++;
} else if (num < maxThreadSize) {
//创建非核心线程池执行
new MyWorker("非核心线程池" + num, tasks).start();
num++;
} else {
System.out.println("任务" + r + "被缓存了");
}
}
}
测试类
package com.java265;
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(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程:" + name + "完成了任务:" + id);
}
@Override
public String toString() {
return "MyTask{" +
"id=" + id +
'}';
}
}
相关阅读:线程池定义时--七大参数指哪些呢?
线程池有哪些状态呢?
创建线程池有哪几种方式呢?
线程池的优点简介说明
线程池中submit()和execute()方法有什么不同呢?
java 中如何运用线程池呢?
线程池的简介说明
Java如何自定义线程池(ThreadPoolExecutor)呢?
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


