相关疑难解决方法(0)

如何使用Java 5中的ExecutorService实现任务优先级划分?

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

现在,从表面上看,我可以使用a PriorityBlockingQueue作为我的任务队列ThreadPoolExecutor,但该队列包含Runnable对象,这可能是也可能不是Runnable我提交给它的任务.而且,如果我已经提交了Callable任务,那么就不清楚它是如何映射的.

有没有办法做到这一点?我真的宁愿不为此而努力,因为我更有可能以这种方式弄错.

(旁白;是的,我知道在这样的事情中,低优先级工作可能会出现饥饿.对于有合理保证公平性的解决方案,可以加分(?!))

java concurrency multithreading

43
推荐指数
2
解决办法
2万
查看次数

如何使用ThreadPoolExecutor和自定义任务实现PriorityBlockingQueue

我经常搜索,但找不到解决问题的方法.

我有自己的类,BaseTask使用a ThreadPoolExecutor来处理任务.
如果我不想要优先级(即使用a PriorityBlockingQueue),这可以正常工作,但当我尝试使用ClassCastException我得到的ThreadPoolExecutor因为FutureTask将我的任务包装到一个FutureTask对象中.
这显然是可以的,因为Comparable它没有实现newTaskFor(),但我将如何继续解决优先级问题?
我读过您可以覆盖ThreadPoolExecutorBaseTask,但我似乎无法在所有发现这个方法...?

我们欢迎所有的建议!

一些代码可以帮助:

在我的BaseFutureTask班上,我有

private static final BlockingQueue<Runnable> sWorkQueue = new PriorityBlockingQueue<Runnable>();

private static final ThreadFactory sThreadFactory = new ThreadFactory() {
    private final AtomicInteger mCount = new AtomicInteger(1);

    public Thread newThread(Runnable r) {
        return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
    }
};

private static final BaseThreadPoolExecutor sExecutor = new BaseThreadPoolExecutor(
    1, Integer.MAX_VALUE, …
Run Code Online (Sandbox Code Playgroud)

java priority-queue executor futuretask threadpool

24
推荐指数
4
解决办法
2万
查看次数

在Java的ThreadPoolExecutor中重新排序队列

可能重复:
Java执行器:如何设置任务优先级?

我有一个使用LinkedBlockingDequeue构建的ThreadPoolExecutor,我想操纵底层队列,但是在文档中阅读这个让我非常紧张.

队列维护

方法getQueue()允许访问工作队列以进行监视和调试.强烈建议不要将此方法用于任何其他目的.当大量排队的任务被取消时,两个提供的方法remove(java.lang.Runnable)和purge()可用于协助存储回收.

具体来说,我希望能够

  1. 检查队列以查看元素是否已存在.我认为这很好,因为只需查看队列中的元素就不需要锁定.
  2. 我想根据一些信号重新排序队列.这显然很麻烦.我想知道是否有一种首选方法可以做到这一点,这样我就不会把队列弄得乱七八糟.

谢谢

java multithreading

8
推荐指数
1
解决办法
772
查看次数

当某些交易的顺序重要时,我如何多线程化队列消费者?

我有一个对一组对象进行操作的任务队列(例如,为了示例,这些对象是地址簿中的条目).

示例任务可能是"将Joe的电话号码更新为888-555-1212".

同时在队列中有多个"更新Joe的电话号码......"任务,但电话号码不同.在这种情况下,必须应用更新以确保最后状态是正确的(并且,为了参数,不能将时间戳放在通讯簿条目上的任务和时间戳上并扔掉陈旧的任务).

使用Joe的更新对Jane进行无序更新是安全的.

我想多线程处理队列,但我需要按人员同步访问.

这种东西有一个方便的库吗?或者我降级为使用Executor并在Runnable的run()方法中对"name"进行自己的同步?

java multithreading thread-safety

6
推荐指数
1
解决办法
623
查看次数

在 ScheduledThreadPoolExecutor 中使用 PriorityBlockingQueue 和 Comparator

首先:我已经阅读了以下两个问题及其可能的解决方案:

我遇到的困境是我想使用自定义队列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, …
Run Code Online (Sandbox Code Playgroud)

java multithreading blockingqueue scheduledexecutorservice

5
推荐指数
1
解决办法
1660
查看次数

异构任务集的动态优先级

我有一堆重复的任务要安排.他们查询数据库以找出要执行的操作,然后执行某些操作,如统计信息更新,发送电子邮件,获取文件和导入文件.目前,可能有十个,这个数字预计会增长很多.我没有给出任何时间限制,实际上,选择算法是我的工作,以便没有人抱怨.:d

目前,我正在使用线程的临时组合和周期性安排的任务

  • 对于最重要的任务,有一个自己的线程在空闲时回落到一个短暂的睡眠状态(当新的重要工作到来时,它可以被唤醒).
  • 另一项重要任务是在自己的线程中每小时安排一次
  • 中等重要性任务被定期安排"填补空洞",因此可能只有其中一个任务在任何时刻运行
  • 最不重要的任务都由一个专用线程处理

它目前似乎运作良好,但它不是面向未来的,并且由于以下原因而感觉不对:

  • 由于最不重要任务的队列可能会增长很多,因此这些任务可能会无限期地延迟.
  • 填充孔可能会出错,并且可能会同时运行许多任务.
  • 在任何给定时刻运行的任务数量应取决于服务器负载.(*)

(*)它主要是一个Web服务器,服务请求实际上是最高优先级.获得单独的服务器无济于事,因为瓶颈通常是数据库.目前,它工作正常,但我正在寻找一个更好的解决方案,因为我们希望负载在一两年内增长100倍.

我的想法是提高工作的优先级,当它被推迟太多时.例如,有统计数据每小时运行一次并将它们延迟几个小时并不是什么大不了的事,但它不应该是一整天而且不应该是整整一周.

我很乐意通过以下工作替换我AbstractExecutionThreadService的所有s和AbstractScheduledServices:

  • 无论如何,立即启动优先级最高的任务.
  • 仅在总负载"小"时启动中优先级任务.
  • 仅当系统"大部分空闲"时才启动优先级最低的任务.
  • 使用提供的公式增加延迟任务的优先级.

这肯定听起来很模糊,让它更精确是我要问的一部分.我的竞争目标是

  • 永远不要拖延重要的任务.
  • 永远不要让太多同时运行的任务太慢地使服务器变慢.

没有硬性截止日期,也没有必要尽量减少使用的线程数.我并不坚持完全按照我的描述做出解决方案,我不是在寻找一个库(我也没有坚持重新发明轮子).我不认为类似cron的调度程序是正确的解决方案.

java scheduler job-scheduling

5
推荐指数
1
解决办法
120
查看次数