import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @Description
* @Author Kang Wentai
* @Date 2024/3/3
**/
public class ThreadPoolTest {
public static void main(String[] args) {
MyThreadPool myThreadPool = new MyThreadPool(2, 4, 20);
for (int i = 0; i <30; i++) {
MyTask myThread = new MyTask(i);
myThreadPool.add(myThread);
}
}
/**
* 任务类:执行当前任务
*
**/
static class MyTask implements Runnable {
private int i;
MyTask(int i){
this.i=i;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println("线程"+name+"正在执行中");
try {
TimeUnit.MICROSECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("线程"+name+"执行完成"+i+"任务");
}
}
@Override
public String toString() {
return "MyThread{" +
"i=" + i +
'}';
}
}
/**
* 线程类:循环执行任务集合中的任务
*
**/
static class MyWorker extends Thread{
List <Runnable> list;
public MyWorker(String name,List<Runnable> tasks) {
super(name);
list=tasks;
}
@Override
public void run() {
while(list.size()>0){
Runnable remove = list.remove(0);
remove.run();
}
}
}
/**
* 线程池类:创建线程池,并设置核心数、最大核心数及队列中所接受的最大任务数
*
* 1、添加任务到当前队列集合中,并判断当前线程数量是否小于核心线程数,小于则添加新的线程并执行集
* 合中的任务。
* 2、如果不小于则判断是否小于最大核心数,小于则添加新的线程并执行集合中的任务。
* 3、如果不小于则等待线程执行。
*
**/
static class MyThreadPool {
private List<Runnable> tasks=Collections.synchronizedList(new LinkedList<>());
private int num;
private int core;
private int maxCore;
private int taskSize;
MyThreadPool(int core,int maxCore,int taskSize){
this.taskSize=taskSize;
this.core=core;
this.maxCore=maxCore;
}
public void add(Runnable runnable){
if(tasks.size()<=taskSize){
tasks.add(runnable);
this.exec();
}else{
System.out.println("线程"+runnable+"已丢弃");
}
}
public void exec(){
if(num<core){
new MyWorker("核心"+num,tasks).start();
num++;
}else if(num<maxCore){
new MyWorker("非核心"+num,tasks).start();
num++;
}else{
System.out.println("暂无空闲线程,等待执行");
}
}
}
}
线程池(自定义线程池)
最新推荐文章于 2024-08-23 15:54:50 发布
本文介绍了如何使用Java实现一个简单的线程池,包括MyThreadPool类,用于设置核心数、最大核心数和任务队列大小,以及MyTask和MyWorker类来执行和管理任务。
摘要由CSDN通过智能技术生成