Java单线程线程池实现指南

介绍

在Java开发中,线程池是一种重要的技术,它可以有效地管理和复用线程,提高程序的性能和并发性。在本文中,我们将学习如何在Java中实现一个简单的单线程线程池。

单线程线程池的流程

下面是实现单线程线程池的步骤和流程:

Step 1: 创建一个任务队列,用于存放需要执行的任务。

Step 2: 创建一个线程,用于执行任务队列中的任务。

Step 3: 当有新的任务加入队列时,线程从队列中取出任务并执行。

Step 4: 线程执行完任务后,检查任务队列是否还有任务,如果有则继续执行,否则线程进入等待状态。

Step 5: 当有新的任务加入队列时,线程被唤醒,继续从队列中取出任务并执行。

Step 6: 重复步骤4和步骤5,直到线程被中断或终止。

实现步骤及代码

Step 1: 创建任务队列

首先,我们需要创建一个任务队列,用于存放需要执行的任务。可以使用java.util.concurrent.LinkedBlockingQueue来实现一个无界的任务队列。

import java.util.concurrent.LinkedBlockingQueue;

public class TaskQueue {
    private LinkedBlockingQueue<Runnable> queue;

    public TaskQueue() {
        this.queue = new LinkedBlockingQueue<>();
    }

    public void addTask(Runnable task) {
        queue.offer(task);
    }

    public Runnable getTask() {
        return queue.poll();
    }
}

Step 2: 创建线程执行任务

接下来,我们需要创建一个线程,用于执行任务队列中的任务。可以使用java.lang.Thread来创建一个线程,并使用java.util.concurrent.atomic.AtomicBoolean来管理线程的运行状态。

import java.util.concurrent.atomic.AtomicBoolean;

public class WorkerThread extends Thread {
    private TaskQueue taskQueue;
    private AtomicBoolean running;

    public WorkerThread(TaskQueue taskQueue) {
        this.taskQueue = taskQueue;
        this.running = new AtomicBoolean(true);
    }

    @Override
    public void run() {
        while (running.get()) {
            Runnable task = taskQueue.getTask();
            if (task != null) {
                task.run();
            } else {
                try {
                    Thread.sleep(100);  // 线程等待一段时间再继续执行
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    }

    public void stopThread() {
        running.set(false);
        interrupt();
    }
}

Step 3: 使用线程池执行任务

我们可以创建一个ThreadPool类来管理线程池的创建和任务的提交。

public class ThreadPool {
    private TaskQueue taskQueue;
    private WorkerThread workerThread;

    public ThreadPool() {
        this.taskQueue = new TaskQueue();
        this.workerThread = new WorkerThread(taskQueue);
    }

    public void submitTask(Runnable task) {
        taskQueue.addTask(task);
        if (!workerThread.isAlive()) {
            workerThread.start();
        }
    }

    public void shutdown() {
        workerThread.stopThread();
    }
}

类图

classDiagram
    class TaskQueue {
        +addTask(Runnable task)
        +getTask():Runnable
    }
    class WorkerThread {
        +run()
        +stopThread()
    }
    class ThreadPool {
        +submitTask(Runnable task)
        +shutdown()
    }
    TaskQueue ..* WorkerThread
    ThreadPool ..> TaskQueue
    ThreadPool ..> WorkerThread

序列图

sequenceDiagram
    participant Client
    participant ThreadPool
    participant TaskQueue
    participant WorkerThread
    Client ->> ThreadPool: submitTask(task)
    ThreadPool ->> TaskQueue: addTask(task)
    ThreadPool ->> WorkerThread: isAlive()
    WorkerThread ->> ThreadPool: start()
    WorkerThread ->> TaskQueue: getTask()
    TaskQueue ->> WorkerThread: task
    WorkerThread ->> Task: run()
    Task ->> WorkerThread: task finished
    WorkerThread ->> TaskQueue: getTask()
    TaskQueue ->> WorkerThread: null
    WorkerThread ->> WorkerThread: sleep(100)
    Client ->> ThreadPool: shutdown()
    ThreadPool ->> WorkerThread: stopThread()
    WorkerThread ->> WorkerThread: interrupt()

总结

通过上述步骤,我们成功地实现了一个简单的单线