是否有可能为Executors执行的任务设置优先级?我在JCIP中发现了一些关于它可能的陈述,但我找不到任何例子,我找不到任何与文档相关的内容.
来自JCIP:
执行策略指定任务执行的"内容,位置,时间和方式",包括:
- ...
- 应该以什么顺序执行任务(FIFO,LIFO,优先顺序)?
- ...
UPD:我意识到我不确切地问我想问什么.我真正想要的是:
如何使用/模拟thread.setPriority()执行程序框架设置线程优先级(即什么)?
一旦PriorityQueue中对象的优先级发生变化,Java是否有一种简单的方法来重新评估堆?我找不到它的任何迹象Javadoc,但必须有办法以某种方式做到这一点,对吧?我正在删除该对象,然后重新添加它,但这显然比在堆上运行更新要慢.
我经常搜索,但找不到解决问题的方法.
我有自己的类,BaseTask使用a ThreadPoolExecutor来处理任务.
如果我不想要优先级(即使用a PriorityBlockingQueue),这可以正常工作,但当我尝试使用ClassCastException我得到的ThreadPoolExecutor因为FutureTask将我的任务包装到一个FutureTask对象中.
这显然是可以的,因为Comparable它没有实现newTaskFor(),但我将如何继续解决优先级问题?
我读过您可以覆盖ThreadPoolExecutor在BaseTask,但我似乎无法在所有发现这个方法...?
我们欢迎所有的建议!
一些代码可以帮助:
在我的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线程池:
ExecutorService c = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; ++i) {
c.execute(new MyTask(i));
}
Run Code Online (Sandbox Code Playgroud)
以这种方式,任务以后续顺序执行(如在队列中).但我需要改变"选择下一个任务"策略.所以我希望为每个任务分配指定优先级(它不是线程优先级),并且执行任务对应于这些优先级.因此,当执行程序完成另一个任务时,它会将下一个任务选为具有最高优先级的任务.它描述了常见问题.也许有更简单的方法不考虑优先级.它选择最后添加的任务作为执行而不是第一次添加.粗略地讲,FixedThreadPool使用FIFO策略.我可以使用例如LIFO策略吗?
我在这个例子中实现了我的ThreadPoolExecutor和PriorityBlockingQueue:https: //stackoverflow.com/a/12722648/2206775
并写了一个测试:
PriorityExecutor executorService = (PriorityExecutor) PriorityExecutor.newFixedThreadPool(16);
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
Thread.sleep(1000);
System.out.println("1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 1);
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
Thread.sleep(1000);
System.out.println("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 3);
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
Thread.sleep(1000);
System.out.println("2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 2);
executorService.submit(new …Run Code Online (Sandbox Code Playgroud) java multithreading priority-queue threadpool threadpoolexecutor