gpt4 book ai didi

java - 如何在 Java 5 中使用 ExecutorService 实现任务优先级?

转载 作者:IT老高 更新时间:2023-10-28 20:41:36 27 4
gpt4 key购买 nike

我正在实现一个线程池机制,我想在其中执行不同优先级的任务。我想有一个很好的机制,我可以向服务提交高优先级任务,并在其他任务之前安排它。任务的优先级是任务本身的固有属性(我是否将该任务表示为 CallableRunnable 对我来说并不重要)。

现在,从表面上看,我可以使用 PriorityBlockingQueue 作为我的 ThreadPoolExecutor 中的任务队列,但该队列包含 Runnable 对象,这可能是也可能不是我提交给它的 Runnable 任务。此外,如果我提交了 Callable 任务,则不清楚这将如何映射。

有没有办法做到这一点?我真的不想为此自己动手,因为那样我更有可能弄错。

(顺便说一句;是的,我知道在这种情况下,优先级较低的工作可能会被饿死。对于具有合理保证公平性的解决方案加分(?!))

最佳答案

我已经以合理的方式解决了这个问题,我将在下面描述它,以供我自己和其他任何在 Java 并发库中遇到这个问题的人引用。

使用 PriorityBlockingQueue因为保留任务以供以后执行的手段确实是朝着正确方向的运动。问题是 PriorityBlockingQueue必须一般实例化以包含 Runnable实例,并且无法调用 compareTo (或类似)在 Runnable界面。

解决问题。创建 Executor 时,必须给它一个 PriorityBlockingQueue .应该进一步为队列提供一个自定义 Comparator 以进行适当的就地排序:

new PriorityBlockingQueue<Runnable>(size, new CustomTaskComparator());

现在,看看 CustomTaskComparator :

public class CustomTaskComparator implements Comparator<MyType> {

@Override
public int compare(MyType first, MyType second) {
return comparison;
}

}

到目前为止,一切看起来都很简单。这里有点粘。我们的下一个问题是处理从 Executor 创建 FutureTasks。在 Executor 中,我们必须覆盖 newTaskFor像这样:

@Override
protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
//Override the default FutureTask creation and retrofit it with
//a custom task. This is done so that prioritization can be accomplished.
return new CustomFutureTask(c);
}

在哪里 cCallable我们正在尝试执行的任务。现在,让我们看看CustomFutureTask :

public class CustomFutureTask extends FutureTask {

private CustomTask task;

public CustomFutureTask(Callable callable) {
super(callable);
this.task = (CustomTask) callable;
}

public CustomTask getTask() {
return task;
}

}

注意 getTask方法。稍后我们将使用它从 CustomFutureTask 中获取原始任务我们创建的。

最后,让我们修改我们试图执行的原始任务:

public class CustomTask implements Callable<MyType>, Comparable<CustomTask> {

private final MyType myType;

public CustomTask(MyType myType) {
this.myType = myType;
}

@Override
public MyType call() {
//Do some things, return something for FutureTask implementation of `call`.
return myType;
}

@Override
public int compareTo(MyType task2) {
return new CustomTaskComparator().compare(this.myType, task2.myType);
}

}

可以看到我们实现了Comparable在任务中委派给实际Comparator对于 MyType .

你有它,使用 Java 库为 Executor 自定义优先级!它需要一些弯曲,但这是我能想到的最干净的。我希望这对某人有帮助!

关于java - 如何在 Java 5 中使用 ExecutorService 实现任务优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/807223/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com