我正在实现一个线程池机制,我想在其中执行不同优先级的任务.我想有一个很好的机制,我可以向服务提交一个高优先级的任务,并在其他任务之前安排它.任务的优先级是任务本身的内在属性(我是否表达任务作为Callable或Runnable不重要的是我).
现在,从表面上看,我可以使用a PriorityBlockingQueue作为我的任务队列ThreadPoolExecutor,但该队列包含Runnable对象,这可能是也可能不是Runnable我提交给它的任务.而且,如果我已经提交了Callable任务,那么就不清楚它是如何映射的.
有没有办法做到这一点?我真的宁愿不为此而努力,因为我更有可能以这种方式弄错.
(旁白;是的,我知道在这样的事情中,低优先级工作可能会出现饥饿.对于有合理保证公平性的解决方案,可以加分(?!))
是否有可能为Executors执行的任务设置优先级?我在JCIP中发现了一些关于它可能的陈述,但我找不到任何例子,我找不到任何与文档相关的内容.
来自JCIP:
执行策略指定任务执行的"内容,位置,时间和方式",包括:
- ...
- 应该以什么顺序执行任务(FIFO,LIFO,优先顺序)?
- ...
UPD:我意识到我不确切地问我想问什么.我真正想要的是:
如何使用/模拟thread.setPriority()执行程序框架设置线程优先级(即什么)?
我有多个线程访问外部资源 - 一个broswer.但是一次只能有一个线程访问它.所以,我正在使用信号量来同步它们.但是,一个线程从GUI获取输入然后访问浏览器以获得结果,应优先于其他线程,我不知道如何使用信号量来实现它.
我认为获取信号量后的每个线程都会检查队列中是否有优先级线程等待,如果是,则将其释放并再次等待.只有优先级线程在获取后才会释放它.
这是一个很好的解决方案还是我可以使用Java API中的其他任何东西?
我有一个线程池ExecutorService对象.在将来的某个时间,使用submit()方法添加任务.我的理解是提交将提交将提交的Runnable添加到要完成的任务列表的末尾.但是我有一种情况,基于布尔我可能想要将runnable提交到要执行的任务的前面.我不希望这会影响当前的任务,只是下一个完成的任务将是我刚刚给出的任务.以下再现示例方法.我该怎么做呢?
谢谢
private ExecutorService singleLoadPool = Executors.newSingleThreadExecutor();
public void submitTask(Runnable run, boolean doNow) {
if (doNow)
singleLoadPool.submitFront(run); // This is the method I'm looking for
else
singleLoadPool.submit(run);
}
Run Code Online (Sandbox Code Playgroud) 请假设以下内容:
public static void main(String[] args) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(0, 5, 1L, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>());
DashboardHtmlExport d = new DashboardHtmlExport();
for (int i = 0; i < 40; i++) {
System.out.println("Submitting: " + i);
try {
Thread.sleep(cooldown);
} catch (InterruptedException e) {
e.printStackTrace();
}
pool.submit(d.new A(i));
}
}
private class A implements Runnable, Comparable<A> {
private int order;
public A(int order) {
this.order = order;
}
public void run() {
try {
Thread.sleep(busyTime);
} catch (InterruptedException e) { …Run Code Online (Sandbox Code Playgroud)