在Java中指定任务顺序执行

编程入门 行业动态 更新时间:2024-10-25 13:14:51
本文介绍了在Java中指定任务顺序执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我搜索了很多但找不到任何解决方案。 我以这种方式使用java线程池:

I've searched a lot but couldn't find any solution. I use java thread pool in such way:

ExecutorService c = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; ++i) { c.execute(new MyTask(i)); }

以这种方式执行任务按顺序执行(如队列中)。但我需要改变选择下一个任务策略。所以我希望为每个任务分配指定优先级(它不是线程优先级),并且执行任务对应于这些优先级。因此,当执行程序完成另一个任务时,它会将下一个任务选为具有最高优先级的任务。 它描述了常见问题。也许有更简单的方法不考虑优先级。它选择最后添加的任务作为执行而不是第一次添加。粗略地讲,FixedThreadPool使用FIFO策略。我可以使用例如LIFO策略吗?

In such way Tasks are executed in consequent order (as in queue). But I need change "select next task" strategy. So I want assign to each task specify priority (it isn't thread priority) and execute tasks correspond to these priorities. So when executor have finished another task it chooses next task as task with maximum priority. It describes common problem. Maybe there is more simple approach which doesn't account priorities. It selects last added task as next to execute instead of first added. Roughly speaking FixedThreadPool use FIFO strategy. Can I use for example LIFO strategy?

推荐答案

你可以使用 PriorityBlockingQueue 指定Queue到ThreadPoolExecutor。

You can use PriorityBlockingQueue to specify Queue to ThreadPoolExecutor.

public class PriorityExecutor extends ThreadPoolExecutor { public PriorityExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); } //Utitlity method to create thread pool easily public static ExecutorService newFixedThreadPool(int nThreads) { return new PriorityExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new PriorityBlockingQueue<Runnable>()); } //Submit with New comparable task public Future<?> submit(Runnable task, int priority) { return super.submit(new ComparableFutureTask(task, null, priority)); } //execute with New comparable task public void execute(Runnable command, int priority) { super.execute(new ComparableFutureTask(command, null, priority)); } }

定义 ComparableFutureTask 比较优先级。

class ComparableFutureTask<T> extends FutureTask<T> implements Comparable<ComparableFutureTask<T>> { volatile int priority = 0; public ComparableFutureTask(Runnable runnable, T result, int priority) { super(runnable, result); this.priority = priority; } public ComparableFutureTask(Callable<T> callable, int priority) { super(callable); this.priority = priority; } @Override public int compareTo(ComparableFutureTask<T> o) { return Integer.valueOf(priority)pareTo(o.priority); } }

更多推荐

在Java中指定任务顺序执行

本文发布于:2023-11-27 20:57:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1639577.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:顺序   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!