如何在运行时更改线程的 Runnable 目标

我想用 Java 构建自己的 ExecutorService,它能够“提交(可调用任务)”给定任务。我打算使用一个包含多个“线程(可运行目标)”的线程池。这个想法是创建固定数量的线程,这些线程从已由“提交”方法填充的列表中取出 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) { }

}


ITMISS
浏览 145回答 2
2回答

缥缈止盈

看一段伪代码:while (true) {&nbsp; &nbsp;task = fetch task&nbsp; &nbsp;If no task: wait/yield&nbsp; &nbsp;Else: execute task&nbsp;}换句话说:您只需实现一个run()方法,该方法循环并执行任何Runnable(或传递给它的任何内容)的 run 方法。如果没有工作可用,则该方法会休眠或等待通知。

一只萌萌小番薯

首先,FutureTask是Runnable,所以你可以task.run();在// TODO.其次,你根本不需要taskQueue = new BlockingQueue<FutureTask<V>>();。将您的实现ExecutorService作为对现有Executor:的补充class MyExecutorService implements ExecutorService {&nbsp; &nbsp;private final Executor executor;&nbsp; &nbsp;public MyExecutorService(Executor executor) {&nbsp; &nbsp; &nbsp; &nbsp;this.executor=executor;&nbsp; &nbsp;}&nbsp; &nbsp;public Future<?> submit(Runnable task) {&nbsp; &nbsp; &nbsp; &nbsp;FutureTask task = new FutureTask(task);&nbsp; &nbsp; &nbsp; &nbsp;executor.exec(task);&nbsp; &nbsp; &nbsp; &nbsp;return task;&nbsp; &nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java