java线程池中提交的任务task 如何实现抢占式优先运行

问答3mos agorelease 鱼渣渣网
27 0
java线程池中提交的任务task 如何实现抢占式优先运行

Java线程池中,可以通过更改线程池的任务调度策略来实现抢占式优先运行。常见的线程池调度策略有两种FIFO(先进先出)和LIFO(后进先出)。FIFO是默认调度策略,即将所有任务按照提交的顺序依次执行;而LIFO是一种高优先级线程先执行的调度策略。

在Java中,Executors类中提供了多个静态方法来创建不同类型的线程池,其中newFixedThreadPool(int n)方法创建的线程池就是一个FIFO队列;newCachedThreadPool0方法创建的线程池也是FIFO队列,但其核心线程数为0,线程数量根据任务数量动态调整,newSinqleThreadExecutor0方法创建的是单个线程的线程池,也是FIFO队列。

对于需要实现抢占式优先运行的场景,可以使用PriorityQueue等方式实践堆积封装特定的或者自定义比较器的实例集合,其中具有更高prioritv值的任务会被排在队列前面并先调度执行。因此,我们可以考虑自己编写定制的ThreadPoolExecutor实现,让它Prioritv Oueue作为任务调度结构,在执行task时,具有更高优先级priorit的task会优先获取CPU资源并先执行。

代码可以按如下步骤实现:

1.定义一个自定义的任务类继承Runnable接口,并在类中添加taskPrioritv属性表示优先级

2.在线程池任务调度方法submit()中,将提交的任务根据它的优先级排在合适的位置。

3.在ThreadPoolExecutor执行任务时,获取线程池中所有未完成任务的Future列表,通过Comparator实现优先级排序。

4.以按照优先级顺序获取任务并执行,实现抢占式优先执行。

示例代码如下:

class PriorityTask implements Runnable {

private int taskPriority;

public PriorityTask(int priority) {this.taskPriority = priority;

@Override

public void run() {

//执行任务的具体逻辑

class PriorityTaskComparator implements Comparator<Runnable> @Override

public int compare(Runnable o1, Runnable o2) {

if (o1 instanceof PriorityTask && o2 instanceof PriorityTask) {return ((PriorityTask)o1).getTaskPriority() – ((PriorityTask)o2).getTaskPriority

return 0;

ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,60L,TimeUnit.SECONDSnew PriorityBlockingQueue<>(),new PriorityTaskComparator());executor.execute(new PriorityTask(1));executor.execute(new PriorityTask(2));executor.execute(new PriorityTask(3)):

© Copyright notes

Related posts

No comments

No comments...