Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ScheduledThreadPoolExecutor с ограниченным размером / 5 сообщений из 5, страница 1 из 1
19.03.2014, 13:12
    #38590489
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ScheduledThreadPoolExecutor с ограниченным размером
делаю пул на основе ScheduledThreadPoolExecutor с ограниченным размером (corePoolSize), чтобы после достижения границы, новая задача отвергалась о чем сообщалось, после удаления одного или более работающих тасков можно опять добавлять новые, в целом работает, но после достижения размера и удаления одного таска, перестает вызываться при (submit, execute) фабрика тредов, а запускается ранее отвергнутый тред, видимо сохраняется в query(больше негде), и getQuery().size() всегда равен 0 хотя таски есть и работают, и не когда не происходит RejectedExecutionException, методы getActiveCount(), getCorePoolSize() работают правильно, активные таски уменьшаются и увеличиваются, удаляю работающие таски через сохраненный future.cancel(true), как это выглядит;

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public class ScheduledTaskCommandExecutor extends ScheduledThreadPoolExecutor {
private final static TaskCommandThreadFactory factory;

  public ScheduledTaskCommandExecutor(int corePoolSize) {
    super(corePoolSize, factory, new RejectionHandler());
    //setMaximumPoolSize(corePoolSize);
    //allowCoreThreadTimeOut(true);
    semaphore = new Semaphore(corePoolSize);
    setRemoveOnCancelPolicy(true);
    setKeepAliveTime(10, TimeUnit.MILLISECONDS);
  }

  static {
    factory = new TaskCommandThreadFactory();
  }

  @Override
  protected void afterExecute(Runnable r, Throwable t) {
    try {
      long endTime = System.nanoTime();
    } finally {
      super.afterExecute(r, t);
      //System.out.println(getTaskNameByFuture((Future) r) + " " + ConsoleProperties.Message.TASK_IS_COMPLETED.get());
      activeTask.remove(r);
      semaphore.release(1);
      purge();
    }
  }



вызываемый из вне метод на выполнение нового таска
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public Future execute(TaskCommand command) throws RejectedExecutionException {
    if(getActiveCount() == getCorePoolSize()) {
      System.out.println(getActiveCount() + " " + getCorePoolSize());
      throw new RejectedExecutionException();
      //так же пробовал с  if(semaphore.tryAcquire()), освобождаю на 1 в afterExecute
    }
    factory.setCommand(command);
    return command.setFuture(schedule(command, command.getDelay(), TimeUnit.MILLISECONDS));
  }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private static class TaskCommandThreadFactory implements ThreadFactory {
    private TaskCommand command;

    public void setCommand(TaskCommand command) {
      this.command = command;
    }

@Override
//метод нормально вызывается до заполнения очереди, после удаления из заполненной одного таска, новый submit не вызывает это
public Thread newThread(Runnable r) {
Thread ret = new Thread(..some custom data from TaskCommand)
return ret;
}



этот обработчик никогда не вызывается, пробовал на другом пуле(fixedPool) работает
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
private static class RejectionHandler implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
      //todo log4j
      System.out.println(r.toString() + " : Rejected");
      throw new RejectedExecutionException();
    }
  }
...
Рейтинг: 0 / 0
19.03.2014, 13:49
    #38590574
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ScheduledThreadPoolExecutor с ограниченным размером
Честно, говоря, не очень понял вашего решения. Но исходя из описание, вам просто нужна специальная очередь нулевого размера для задач, которая бы всегда реджектила эти самые задачи, если их нельзя сразу запустить в свободных потоках.
...
Рейтинг: 0 / 0
19.03.2014, 13:58
    #38590594
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ScheduledThreadPoolExecutor с ограниченным размером
так не понятного ?
хочу чтобы ScheduledThreadPoolExecutor был ограниченный, как тут поможет нулевой размер
...
Рейтинг: 0 / 0
19.03.2014, 14:15
    #38590626
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ScheduledThreadPoolExecutor с ограниченным размером
breathтак не понятного ?
Не понятно что такое " отвергнутый тред". Отвергаются задачи, а не потоки. Потоки прерываются, если нужно.

breathхочу чтобы ScheduledThreadPoolExecutor был ограниченный, как тут поможет нулевой размер
Ограниченый по чему? Есть размер пула потоков. Есть размер очереди задач. Если нельзя создать новый поток и очередь отвергает задачу, то вызывается RejectHandler. Там вы можете делать с отвергнутой задачей что угодно.
...
Рейтинг: 0 / 0
19.03.2014, 14:39
    #38590664
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ScheduledThreadPoolExecutor с ограниченным размером
>Не понятно что такое " отвергнутый тред". Отвергаются задачи, а не потоки. Потоки прерываются, если нужно.

ну при execute или submit сначала порождается thread в ThreadFactory, потом этот тип объекта передается в
@Override
protected void beforeExecute(Thread t, Runnable r) {
поэтому и написал отвергнутый тред, хотя в данном контексте thread == задаче

>Ограниченый по чему? Есть размер пула потоков. Есть размер очереди задач. Если нельзя создать новый поток и очередь отвергает задачу, то вызывается RejectHandler. Там вы можете делать с отвергнутой задачей что угодно.

это понятно, но в ScheduledThreadPoolExecutor delayedQuery, поэтому мне кажется RejectionHandler от него не дождаться, вот и делаю проверкой на getActiveCount() == getCorePoolSize(), и это срабатывает, как написал после future.cancel, getActiveCount уменьшается, но дальшейшие submit не вызывают фабрику, в этом баг
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / ScheduledThreadPoolExecutor с ограниченным размером / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]