首页 > 编程语言 > 详细

线程池的简单实现(Java)

时间:2021-04-19 23:26:12      阅读:30      评论:0      收藏:0      [点我收藏+]

实际开发中,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]);
        }
    }
}

线程池的简单实现(Java)

原文:https://www.cnblogs.com/techrice/p/14678411.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!