我想用Java构建自己的ExecutorService,它能够“提交(可调用任务)”给定任务。 我打算使用包含多个“线程(可运行目标)”的线程池。 这个想法是创建一个固定数量的线程,该线程将从'submit'方法填充的列表中退出FutureTask对象。 FutureTask对象也已在Submit方法中创建。 我的问题是,创建线程时(通过构造函数),我只能将Runnable对象(此处为:FutureTask)移交给线程,但是显然,FutureTasks需要动态分配给线程(当从列表中删除该项目时) )。 有什么办法吗?
// content of submit, parameter: myTask
FutureTask<V> newFutureTask = new FutureTask<V>(myTask);
taskQueue = new BlockingQueue<FutureTask<V>>();
try {
taskQueue.put(newFutureTask);
} catch (InterruptedException ex) { }
return newFutureTask;
// remove item from list and hand it over to thread
// method within MyThread extends Thread (thread pool) class
void exec() {
FutureTask<V> task;
try {
task = taskQueue.take();
// TODO: run task somehow????
} catch(InterruptedException ex) { }
}
答案 0 :(得分:0)
查看一些伪代码:
while (true) {
task = fetch task
If no task: wait/yield
Else: execute task
换句话说:您只需要实现一个run()方法即可循环并执行任何Runnable(或传递给它的任何东西)的run方法。如果没有可用的工作,则该方法将休眠或等待被通知。
答案 1 :(得分:0)
首先,FutureTask
是Runnable
,因此您只需在task.run();
所在的行中插入// TODO
。
第二,您根本不需要taskQueue = new BlockingQueue<FutureTask<V>>();
。将ExecutorService
的实现作为现有Executor
的补充:
class MyExecutorService implements ExecutorService {
private final Executor executor;
public MyExecutorService(Executor executor) {
this.executor=executor;
}
public Future<?> submit(Runnable task) {
FutureTask task = new FutureTask(task);
executor.exec(task);
return task;
}
}