powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ScheduledThreadPoolExecutor с ограниченным размером
5 сообщений из 5, страница 1 из 1
ScheduledThreadPoolExecutor с ограниченным размером
    #38590489
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делаю пул на основе 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
ScheduledThreadPoolExecutor с ограниченным размером
    #38590574
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно, говоря, не очень понял вашего решения. Но исходя из описание, вам просто нужна специальная очередь нулевого размера для задач, которая бы всегда реджектила эти самые задачи, если их нельзя сразу запустить в свободных потоках.
...
Рейтинг: 0 / 0
ScheduledThreadPoolExecutor с ограниченным размером
    #38590594
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так не понятного ?
хочу чтобы ScheduledThreadPoolExecutor был ограниченный, как тут поможет нулевой размер
...
Рейтинг: 0 / 0
ScheduledThreadPoolExecutor с ограниченным размером
    #38590626
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathтак не понятного ?
Не понятно что такое " отвергнутый тред". Отвергаются задачи, а не потоки. Потоки прерываются, если нужно.

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

ну при 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
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / ScheduledThreadPoolExecutor с ограниченным размером
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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