java - 如何在运行时更改线程的 Runnable 目标
问题描述
我想用 Java 构建自己的 ExecutorService,它能够“提交(可调用任务)”给定任务。我打算使用一个包含多个“线程(可运行目标)”的线程池。这个想法是创建固定数量的线程,这些线程将 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) { }
}
解决方案
看一点伪代码:
while (true) {
task = fetch task
If no task: wait/yield
Else: execute task
}
换句话说:您只需要实现一个run()方法,该方法循环并执行任何Runnable(或传递给它的任何内容)的 run 方法。如果没有可用的工作,则该方法会休眠或等待通知。
推荐阅读
- amazon-web-services - 纱线和 npm 的问题
- c# - 来电者的 YouTube 帐户未连接到 Google+
- javascript - 使用 JS 在 iframe 上显示图像
- c++ - Gtkmm 不断检查 Gtk::Calendar 上的选定日期是否更改
- python - Matplotlib 直方图
- c++ - 如何配置 Visual Studio Code 以使用 cygwin、cmake 和 gcc 进行调试
- python - Python:通过为每个原始元素添加 n 个元素来扩展字符串列表
- python - CNN 学习不合适,如何知道我的数据集是否足够?
- r - 如何在R中的时间序列上绘制多项式回归线?
- c - 如何使用 Semaphore 阻止和打开客户端?信号量问题