Я хочу реализовать пул потоков, чтобы задачи могли выполняться в определенное время, переопределяя хук afterExecute
. Могу ли я снова отправить аргумент Runnable r
?
Вот моя первоначальная реализация.
public class RetriableThreadPool extends ThreadPoolExecutor {
static final int MAXRETRYTIMES = 5;
int retryTimes = 0;
public RetriableThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
retryTimes = 0;
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (retryTimes < MAXRETRYTIMES) {
retryTimes++;
super.submit(r);
}
}
}
В этой первоначальной реализации я просто разрешаю отправить одну задачу.
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
public class ThreadPoolTest {
public static void main(String[] args) {
RetriableThreadPool retriableThreadPool = new RetriableThreadPool(10, 10, 0L,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
retriableThreadPool.execute(new Runnable() {
int num = 0;
@Override
public void run() {
// TODO Auto-generated method stub
num = num + 123;
System.out.println(num);
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// retriableThreadPool.shutdown();
}
}
В этом примере я получил странный вывод:
123
246
Если runnable может быть повторно отправлен, я думаю, что должен получить 5 выходов. Если это не может быть повторно представлено. Только 123 должно быть результатом. Я не понимаю причину этого вывода.
Я изменил код благодаря nogard
public class RetriableThreadPool extends ThreadPoolExecutor {
static final int MAXRETRYTIMES = 5;
int retryTimes = 0;
public RetriableThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
retryTimes = 0;
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (retryTimes < MAXRETRYTIMES) {
retryTimes++;
super.execute(r);
}
}
}
У меня есть еще 3 вопроса:
- Как повторить запуск с исходным состоянием. В этом случае я ожидал, что результаты будут в 5 раз больше 123.
- Как добавить хуки для метода
submit
так же, какafterExecute
дляexecute
- Есть ли уже хорошая реализация retriable threadpool? Я хочу, чтобы runnable повторялся, когда выбрасываются исключения или callable возвращает определенные результаты.