实际开发中,Java
已经为开发者提供了 java.util.concurrent.ThreadPoolExecutor
线程池。本文的目的主要是通过实现简单的线程池,熟练掌握线程、锁、线程间通信、线程池内部原理等知识。以下是代码实现:
(1)线程池 ThreadPool 类
import java.util.LinkedList;
public class ThreadPool {
/* 对象属性 */
private int poolSize; // 任务消费者个数
private LinkedList<Runnable> taskList = new LinkedList<>(); // 装线程任务的容器
/* 构造方法 */
public ThreadPool() {
// 设置任务消费者个数
poolSize = 10;
// 启动 poolSize 个任务消费者线程
synchronized(taskList) {
for(int i = 0; i < poolSize; i++) {
new TaskConsumeThread("任务消费者线程 " + i).start();
}
}
}
/* 对象方法 */
public void addTask(Runnable newTask) {
synchronized(taskList) {
// 将线程任务添加到容器中
taskList.addFirst(newTask);
// 唤醒等待的任务消费者线程
taskList.notifyAll();
}
}
/* 内部类 */
// 任务消费者
private class TaskConsumeThread extends Thread {
/* 对象属性 */
Runnable task;
/* 构造方法 */
public TaskConsumeThread(String name) {
super(name);
}
/* 对象方法 */
// 重写父类的 run() 方法
@Override
public void run() {
System.out.println("启动: " + this.getName());
while(true) {
// 同步对象 --- 装线程任务的容器
synchronized(taskList) {
// 判断容器是否为空
while(taskList.isEmpty()) {
try {
taskList.wait(); // 为空则等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 不为空则取出任务
task = taskList.removeLast();
// 唤醒其他线程
taskList.notifyAll();
}
// 执行任务
System.out.println(this.getName() + " 获取到任务,并执行");
task.run();
}
}
}
}
(2)测试
public class ThreadPoolTest {
/* 程序入口 */
public static void main(String[] args) {
// 定义一个线程池
ThreadPool pool = new ThreadPool();
// 给线程池添加任务
Runnable[] tasks = new Runnable[20];
for(int i = 0; i < tasks.length; i++) {
tasks[i] = new Runnable() {
@Override
public void run() {
// 填入不同的任务
System.out.println("执行");
}
};
pool.addTask(tasks[i]);
}
}
}
原文:https://www.cnblogs.com/techrice/p/14678411.html