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

时间:2019-06-01 11:53:20

标签: java multithreading runnable

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

2 个答案:

答案 0 :(得分:0)

查看一些伪代码:

while (true) {
   task = fetch task
   If no task: wait/yield
   Else: execute task 

换句话说:您只需要实现一个run()方法即可循环并执行任何Runnable(或传递给它的任何东西)的run方法。如果没有可用的工作,则该方法将休眠或等待被通知。

答案 1 :(得分:0)

首先,FutureTaskRunnable,因此您只需在task.run();所在的行中插入// TODO

第二,您根本不需要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;
   }
}