Как изменить цель Runnable потока во время выполнения - PullRequest
2 голосов
/ 01 июня 2019

Я хочу создать свой собственный ExecutorService на Java, который способен «отправлять (вызываемая задача)» заданную задачу. Я намеревался использовать пул потоков, состоящий из нескольких потоков (Runnable target). Идея состоит в том, чтобы создать фиксированное количество потоков, которые удаляют объекты FutureTask из списка, который был заполнен методом submit. Объекты 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 ]

1 голос
/ 01 июня 2019

См. Немного псевдокода:

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

Другими словами: вам просто нужно реализовать метод run () , который зацикливает и выполняет метод run любого Runnable (или чего бы то ни было, переданного ему). Если работа недоступна, этот метод спит или ожидает уведомления.

0 голосов
/ 01 июня 2019

Во-первых, FutureTask - это Runnable, поэтому вы можете просто 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;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...