Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改线程';s在运行时期间可运行的目标_Java_Multithreading_Runnable - Fatal编程技术网

Java 如何更改线程';s在运行时期间可运行的目标

Java 如何更改线程';s在运行时期间可运行的目标,java,multithreading,runnable,Java,Multithreading,Runnable,我想用Java构建我自己的ExecutorService,它能够“提交(可调用任务)”给定的任务。 我打算使用一个由几个“线程(可运行目标)”组成的线程池。 其思想是创建一个固定数量的线程,将FutureTask对象从“submit”方法填充的列表中出列。FutureTask对象也已在submit方法中创建。 我的问题是,我只能在创建线程时(通过构造函数)将可运行对象(这里是:FutureTask)移交给线程,但显然FutureTask需要动态分配给线程(当项目从列表中删除时)。 有没有办法做到

我想用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(任务);
执行人。执行人(任务);
返回任务;
}
}

我想你是在为教育目的重新发明轮子?明白了。非常感谢你。