MST

星途 面试题库

面试题:Java单线程池任务执行顺序优化与场景应用

在高并发且任务执行时间差异较大的场景下,如何优化Java单线程池的任务执行顺序以提高整体效率?例如,某些任务优先级较高,需要优先执行。请详细说明实现思路,并结合具体代码示例阐述如何在Java单线程池中实现自定义的任务调度策略。
37.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 使用PriorityQueue来存储任务,PriorityQueue可以根据任务的优先级对任务进行排序。
    • 自定义一个实现Runnable接口的任务类,并实现Comparable接口来定义任务的优先级比较逻辑。
    • 在单线程池中,从PriorityQueue中取出优先级最高的任务来执行。
  2. 代码示例
import java.util.PriorityQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class PrioritizedTask implements Runnable, Comparable<PrioritizedTask> {
    private final int priority;
    private final String taskName;

    public PrioritizedTask(int priority, String taskName) {
        this.priority = priority;
        this.taskName = taskName;
    }

    @Override
    public void run() {
        System.out.println("Executing task: " + taskName + " with priority: " + priority);
        // 模拟任务执行时间
        try {
            Thread.sleep((long) (Math.random() * 1000));
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    @Override
    public int compareTo(PrioritizedTask other) {
        return Integer.compare(this.priority, other.priority);
    }
}

public class SingleThreadPoolPriorityScheduler {
    public static void main(String[] args) {
        PriorityQueue<PrioritizedTask> taskQueue = new PriorityQueue<>();
        taskQueue.add(new PrioritizedTask(3, "Task C"));
        taskQueue.add(new PrioritizedTask(1, "Task A"));
        taskQueue.add(new PrioritizedTask(2, "Task B"));

        ExecutorService executorService = Executors.newSingleThreadExecutor();
        while (!taskQueue.isEmpty()) {
            PrioritizedTask task = taskQueue.poll();
            executorService.submit(task);
        }
        executorService.shutdown();
    }
}

在上述代码中:

  • PrioritizedTask类实现了Runnable接口和Comparable接口,compareTo方法定义了任务优先级的比较逻辑,数值越小优先级越高。
  • SingleThreadPoolPriorityScheduler类中,创建了一个PriorityQueue来存储任务,并向其中添加了具有不同优先级的任务。
  • 使用Executors.newSingleThreadExecutor()创建了一个单线程池,从PriorityQueue中按优先级取出任务并提交到单线程池中执行。最后调用executorService.shutdown()关闭线程池。