如何在运行时更改线程的 Runnable 目标
How to change a thread's Runnable target during runtime
我想在 Java 中构建自己的 ExecutorService,它能够 'submit(Callable task)' 给定任务。
我打算使用一个包含多个 'Threads(Runnable target)' 的线程池。
这个想法是创建固定数量的线程,这些线程从 'submit' 方法填充的列表中取出 FutureTask 对象。 FutureTask 对象也在提交方法中创建。
我的问题是我只能在创建线程时(通过构造函数)将一个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) { }
}
看一点伪代码:
while (true) {
task = fetch task
If no task: wait/yield
Else: execute task
}
换句话说:您只需实现一个 运行() 方法,该方法循环并执行任何 [=15= 的 运行 方法]Runnable(或传递给它的任何内容)。如果没有工作可用,则该方法会休眠或等待通知。
首先,FutureTask
是 Runnable
,因此您可以在 // TODO
.
行中 task.run();
其次,您根本不需要 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;
}
}
我想在 Java 中构建自己的 ExecutorService,它能够 'submit(Callable task)' 给定任务。 我打算使用一个包含多个 'Threads(Runnable target)' 的线程池。 这个想法是创建固定数量的线程,这些线程从 'submit' 方法填充的列表中取出 FutureTask 对象。 FutureTask 对象也在提交方法中创建。 我的问题是我只能在创建线程时(通过构造函数)将一个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) { }
}
看一点伪代码:
while (true) {
task = fetch task
If no task: wait/yield
Else: execute task
}
换句话说:您只需实现一个 运行() 方法,该方法循环并执行任何 [=15= 的 运行 方法]Runnable(或传递给它的任何内容)。如果没有工作可用,则该方法会休眠或等待通知。
首先,FutureTask
是 Runnable
,因此您可以在 // TODO
.
task.run();
其次,您根本不需要 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;
}
}