- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
首先:我已经阅读了以下两个问题及其可能的解决方案:
我遇到的难题是我想使用自定义 BlockingQueue
或者更确切地说是一个不同但特定的队列,即 PriorityBlockingQueue
自定义 Comparator
它按优先级对队列进行排序。
ThreadPoolExecutor
在其构造函数中支持自定义队列,但它不实现 ScheduledExecutorService
中的方法界面。所以我去找了子类 ScheduledThreadPoolExecutor
, 但它不支持自定义队列并使用 DelayedWorkQueue
反而。
问题:
ScheduledThreadPoolExecutor
扩展因为为我自己的类创建构造函数不会做任何事情,因为 ScheduledThreadPoolExecutor
的构造函数不接受自定义队列作为参数。ThreadPoolExecutor
的内容类和 ScheduledThreadPoolExecutor
的实现因为它使用了很多用没有修饰符声明的方法(例如canRunInCurrentState(boolean periodic)
和这个调用调用的所有方法)这不允许我访问该方法,因为即使它是ThreadPoolExecutor
, 它不在同一个包中。我目前的实现是这样的:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.croemheld.tasks.PriorityTaskComparator;
public class ScheduledPriorityThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService {
private static final int INITIAL_QUEUE_SIZE = 10;
public ScheduledPriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new PriorityBlockingQueue<Runnable>(INITIAL_QUEUE_SIZE, new PriorityTaskComparator()));
}
public ScheduledPriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new PriorityBlockingQueue<Runnable>(INITIAL_QUEUE_SIZE, new PriorityTaskComparator()), handler);
}
public ScheduledPriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new PriorityBlockingQueue<Runnable>(INITIAL_QUEUE_SIZE, new PriorityTaskComparator()), threadFactory);
}
public ScheduledPriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new PriorityBlockingQueue<Runnable>(INITIAL_QUEUE_SIZE, new PriorityTaskComparator()), threadFactory, handler);
}
@Override
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
// TODO Auto-generated method stub
return null;
}
@Override
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
// TODO Auto-generated method stub
return null;
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
// TODO Auto-generated method stub
return null;
}
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
// TODO Auto-generated method stub
return null;
}
}
如您所见,构造函数问题已解决,但仍保留来自 ScheduledExecutorService
的调度方法的实现。 .
所以我问你,有没有什么办法可以传递 Comparator
到队列或一个简单而不是太详尽的方法来创建一个自己的执行器类,它实现了ScheduledExecutorService
中的方法。并提供来自 ThreadPoolExecutor
的方法类以及使用 PriorityBlockingQueue
?
最佳答案
如果我理解你的问题,你想定期执行一些任务,但要根据一些自定义优先级。如果没有发明您自己的 ExecutorService
,我建议退后一步,看看您的设计。您可能希望将调度与优先级排序和任务执行分开:
ThreadPoolExecutor
接受自定义 BlockingQueue
,您可以轻松实现自己的优先级排序。然后只需定期从代码中的其他地方提交任务。ScheduledThreadPoolExecutor
,那么您可以进行调度,但您必须自己实现优先级排序。您可以非常有创意地使用它,但一种选择可能是让编排任务从自定义 BlockingQueue
中挑选任务并提交到池中。关于java - 在 ScheduledThreadPoolExecutor 中使用带有比较器的 PriorityBlockingQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245458/
我使用 PriorityBlockingQueue 来维护对象列表,这些对象的顺序由比较器决定。我的要求如下:首先,我将N对象添加到队列中,队列用它来维护有序列表。后来,我更改了已添加到队列中的对象中
在PriorityBlockingQueue的规范中,它说: While this queue is logically unbounded, attempted additions may fail
我有一个PriorityBlockingQueue如下: BlockingQueue robbleListQueue = new PriorityBlockingQueue(); Robble实现Co
我有一个包含元素列表的 PriorityBlockingQueue。我已经实现了 Comparable 接口(interface)并覆盖了 compareTo() 以定义哪个元素小于、等于或大于其他元
我正在使用 PriorityBlockingQueue 来存储功能的 tf-idf 分数。由于这部分是多线程的,我使用 synchronized block 来处理并发性: long ticAdd =
我正在尝试编写一个返回 CompletableFuture 的单线程执行器当任务被调度并基于 PriorityBlockingQueue 执行任务时. 我的任务如下所示: public inter
如果某个任务已经在阻塞队列中(假设轮询已满)并且我现在希望它具有更高的优先级,如何更改它的优先级? 例如:实现这个答案 Specify task order execution in Java 我将线
我有一个应用程序,它从多个序列化对象日志中读取对象并将它们交给另一个类进行处理。我的问题集中在如何高效、干净地读取对象并将其发送出去。 代码是从应用程序的旧版本中提取的,但我们最终保持原样。直到上周才
根据Javadocs , PriorityBlockingQueue 不保证具有相同优先级的元素的排序。他们建议使用辅助键 (sequenceNumber) 来强制执行特定的排序(例如 FIFO)。
我一直在阅读 source code of PriorityBlockingQueue在 Java 中,我想知道: 为什么 tryGrow() 方法释放在 offer() 方法中获取的锁,只是为了非阻
我有一个 PriorityBlockingQueue。单个线程一次从该队列中消费一条消息并对其进行处理。其他几个线程正在将消息插入队列。生产者线程为他们提交的每条消息分配一个完整的优先级。静态 Ato
PriorityBlockingQueue 有多少把锁?take 和put 操作是否同步?我找不到有关此类队列的太多信息。我使用的是单线程 PriorityQueue。 最佳答案 How many l
DelayQueue public class DelayQueue extends AbstractQueue implements BlockingQueue 1、 Delayed元
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭10 年前。 Improve th
我正在尝试为我的游戏制作一个简单的消息管理器。但是,我收到以下异常: Exception in thread "main" Exception in thread "Thread-4" java.la
public class CompareOrder implements Comparator { @Override public int compare(T left, T rig
我在自定义线程拉取中使用 PriorityBlockingQueue 时遇到问题,其中 poll 方法导致 NullPointerException。使用此设置时 int POOL_SIZE = 5;
首先:我已经阅读了以下两个问题及其可能的解决方案: ScheduledThreadPoolExecutors and custom queue Java Executors: how can I se
我在这个例子中使用 PriorityBlockingQueue 实现了我的 ThreadPoolExecutor: https://stackoverflow.com/a/12722648/22067
我进行了很多搜索,但找不到解决问题的方法。 我有自己的类 BaseTask,它使用 ThreadPoolExecutor 来处理任务。我想要任务优先级,但是当我尝试使用 PriorityBlockin
我是一名优秀的程序员,十分优秀!