2013-12-09 3 views
2

В принципе, мне нужно оборудование, чтобы иметь следующее:исполнитель отменить в ожидании задачи - необходимая помощь

  1. фиксированного размером пула потоков для выполнения задач
  2. очереди отложенных заданий (запрошенных, но пока не работает)
  3. Отмена задания в ожидании очереди (задача идентифицируется идентификатором)
  4. Отмена текущей задачи
  5. Данный идентификатор задачи, запрос, является ли задача До или Запуск

Может ли кто-нибудь предложить лучший способ достичь этого, особенно пункты 3-5. Я бы очень признателен за пример кода.

Спасибо.

+1

Любую попытку решить эту проблему? – Fedy2

+2

Ответ может быть в ваших тегах :) – aditsu

ответ

1

Все, кроме состояний задачи и отмены, является стандартным для пулов потоков. Отмены и государственный статус могут быть сделаны следующим образом:

enum TaskState {PENDING, RUNNING}; 

abstract class MyCallable<V> implements Callable<V>{ 
    protected volatile TaskState state = PENDING; 

    // to make sure state is always set before running the task 
    protected abstract V doCall(); 

    final V call(){ 
     state = RUNNING; 
     return doCall(); 
    } 

    public TaskState getState() { return state; } 
} 

... 

ExecutorService executor = Executors.newFixedThreadPool(4); 

Future<V> future = executor.submit(new MyCallable<V>() { 
    public V doCall() throws Exception { 
     //... some work ... 
     if(Thread.interrupted()){ 
      removeFromMap(); 
      return null; 
     } 
    } 
}); 

... 

future.cancel(true); 

Чтобы сделать задачу сократимой нужно проверить Thread.interrupted() состояния во время его выполнения или какой-либо другой логический логический флаг. После получения будущего для отправленной задачи необходимо вызвать future.cancel(true), чтобы отменить задачу, прервав ее.

+0

спасибо тонну. Несколько вопросов: 1. Я думаю, после 'executor.submit' мне также нужно сделать что-то вроде' pendingMap.put (id, future); 'и удалить элемент с этой карты в' MyCallable.call', так как мне нужно отменить по id 2. Вы настоятельно рекомендуете использовать 'Callable'? Я думал «Runnable», так как мне не нужно возвращать значение 3. ThreadPool управляется службой android. Мне нужно прекратить обслуживание, когда все задачи будут обработаны. Каким образом это можно обнаружить? – kiruwka

+0

1. Просто используйте «ConcurrentHashMap» и удалите положительный тест на прерывание (изнутри) или при отмене (вне задачи). 2. «Runnable» в порядке 3. 'executor.shutdown(); executor.awaitTermination(); 'Первая команда перестает принимать дополнительные задания, вторая ожидает, что все выполняемые задания завершатся. Надеюсь это поможет! –

+0

Спасибо. Что касается 3. Я на самом деле имел в виду по-другому: я хочу продолжать отправлять задания, но когда все будет обработано, мне нужно будет остановить службу. Поэтому я предполагаю, что правильный подход будет заключаться в следующем: в конце каждой задачи проверьте, является ли hashMap пустым (без запущенных/поставленных задач), если это так -> остановить службу. Я думаю, что это должно сработать. – kiruwka

0

Все, что вам нужно, это в тегах. Если вы используете фиксированный пул потоков ExecutorService, вы можете ограничить количество потоков, которые могут выполняться одновременно.

Если представлено больше потоков, чем можно обрабатывать, они хранятся в очереди.

Вызов методы представить() в качестве ExecutorService даст вам Future объект, который даст вам знать, является ли задача или незавершенным оно было отменено, и т.д.

У меня есть ряд учебников по ExecutorService: http://codelatte.wordpress.com/2013/11/09/a-simple-newfixedthreadpool-example/

Как использовать Future объект: http://codelatte.wordpress.com/2013/11/08/a-simple-cachedthreadpool-example/

Смежные вопросы