java多线程并发executorservice(任务调度)类


在Java中,`ExecutorService` 是一个用于异步执行任务的框架,它使得线程的创建和管理变得简单。下面是一个使用 `ExecutorService` 的基本示例,展示了如何创建一个简单的任务调度类。


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

// 定义一个任务类,实现Runnable接口
class Task implements Runnable {
    private String command;

    public Task(String s) {
        this.command = s;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " Start. Command = " + command);
        processCommand();
        System.out.println(Thread.currentThread().getName() + " End.");
    }

    // 模拟任务执行
    private void processCommand() {
        try {
            Thread.sleep(500); // 模拟任务执行耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String toString() {
        return this.command;
    }
}

// 定义一个任务调度类
public class TaskScheduler {

    private final int numberOfThreads;
    private ExecutorService executor;

    public TaskScheduler(int numberOfThreads) {
        this.numberOfThreads = numberOfThreads;
        this.executor = Executors.newFixedThreadPool(numberOfThreads);
    }

    // 提交任务到线程池
    public void execute(Runnable task) {
        executor.execute(task);
    }

    // 关闭线程池
    public void shutdown() {
        executor.shutdown();
        try {
            // 等待所有任务完成
            if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
                // 取消当前正在执行的任务
                executor.shutdownNow();
            }
        } catch (InterruptedException ie) {
            // 当前线程在等待时被中断
            executor.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }

    public static void main(String[] args) {
        TaskScheduler scheduler = new TaskScheduler(5); // 创建一个有5个线程的线程池

        for (int i = 0; i < 10; i++) {
            Runnable worker = new Task("" + i);
            scheduler.execute(worker);
        }

        scheduler.shutdown();
    }
}

这段代码首先定义了一个 `Task` 类,它实现了 `Runnable` 接口,并包含一个 `run` 方法来执行具体的任务。然后,定义了一个 `TaskScheduler` 类,它使用 `ExecutorService` 来管理多个线程。在 `main` 方法中,我们创建了一个 `TaskScheduler` 实例,并提交了10个任务到线程池中执行。最后,调用 `shutdown` 方法来优雅地关闭线程池。