Java 如何更改线程';s在运行时期间可运行的目标
我想用Java构建我自己的ExecutorService,它能够“提交(可调用任务)”给定的任务。 我打算使用一个由几个“线程(可运行目标)”组成的线程池。 其思想是创建一个固定数量的线程,将FutureTask对象从“submit”方法填充的列表中出列。FutureTask对象也已在submit方法中创建。 我的问题是,我只能在创建线程时(通过构造函数)将可运行对象(这里是:FutureTask)移交给线程,但显然FutureTask需要动态分配给线程(当项目从列表中删除时)。 有没有办法做到这一点Java 如何更改线程';s在运行时期间可运行的目标,java,multithreading,runnable,Java,Multithreading,Runnable,我想用Java构建我自己的ExecutorService,它能够“提交(可调用任务)”给定的任务。 我打算使用一个由几个“线程(可运行目标)”组成的线程池。 其思想是创建一个固定数量的线程,将FutureTask对象从“submit”方法填充的列表中出列。FutureTask对象也已在submit方法中创建。 我的问题是,我只能在创建线程时(通过构造函数)将可运行对象(这里是:FutureTask)移交给线程,但显然FutureTask需要动态分配给线程(当项目从列表中删除时)。 有没有办法做到
// 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) { }
}
//提交的内容,参数:myTask
FutureTask newFutureTask=新建FutureTask(myTask);
taskQueue=newblockingqueue();
试一试{
taskQueue.put(newFutureTask);
}catch(InterruptedException ex){}
返回新的未来任务;
//从列表中删除项目并将其移交给线程
//MyThread中的方法扩展线程(线程池)类
void exec(){
未来任务;
试一试{
task=taskQueue.take();
//TODO:以某种方式运行任务????
}catch(InterruptedException ex){}
}
请参阅一些伪代码:
while (true) {
task = fetch task
If no task: wait/yield
Else: execute task
}
换句话说:您只需实现一个run()方法,该方法循环并执行任何Runnable(或传递给它的任何内容)的run方法。如果没有可用的工作,则该方法将休眠或等待通知 首先,
FutureTask
是Runnable
,因此您可以只task.run()代码>在包含//TODO
的行中
其次,您不需要taskQueue=newblockingqueue()代码>完全正确。将执行器服务的实现作为现有执行器的补充:
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;
}
}
类MyExecutorService实现ExecutorService{
私人最终执行人;
公共MyExecutorService(执行者执行者){
这个。执行者=执行者;
}
公共未来提交(可运行任务){
FutureTask任务=新的FutureTask(任务);
执行人。执行人(任务);
返回任务;
}
}
我想你是在为教育目的重新发明轮子?明白了。非常感谢你。