Я пытаюсь загрузить несколько файлов с URL-адреса и выполнить некоторые действия с помощью threadpoolexecutor. Действие - проверить, не поврежден ли файл. Скажем так, на сайте 20 документов. Если я пытаюсь создать поток с одной нитью, он проверяет все 20 документов. Однако, если я использую 15 потоков, только 10 файлов проверяются правильно. Кажется, что остальные файлы работают в фоновом режиме более 1 часа, что вызывает ожидание следующего URL.
Я использую пользовательский пул потоков в приложении весенней загрузки.
THREAD_CORE_POOL_SIZE=15
THREAD_MAX_POOL_SIZE=15
threadKillTime is 1 hour
BlockingThreadPoolExecutor executor = new BlockingThreadPoolExecutor(THREAD_CORE_POOL_SIZE, THREAD_MAX_POOL_SIZE,
threadKillTime, TimeUnit.MILLISECONDS, new SynchronousQueue<>(),
new CustomThreadFactory("valid-file-checker"),
new ThreadPoolExecutor.AbortPolicy());
BlockingThreadPoolExecutor. java
public class BlockingThreadPoolExecutor extends ThreadPoolExecutor {
private static final Logger logger = LoggerFactory.getLogger(BlockingThreadPoolExecutor.class);
private final Semaphore semaphore;
public BlockingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue, ThreadFactory factory, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, factory, handler);
semaphore = new Semaphore(corePoolSize + 50);
}
@Override
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
}
@Override
public void execute(final Runnable task) {
boolean acquired = false;
do {
try {
semaphore.acquire();
acquired = true;
} catch (final InterruptedException e) {
// LOGGER.warn("InterruptedException whilst aquiring semaphore", e);
}
} while (!acquired);
try {
super.execute(task);
} catch (final RejectedExecutionException e) {
logger.error("Task Rejected");
semaphore.release();
throw e;
}
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t != null) {
t.printStackTrace();
}
semaphore.release();
}
}
Я попытался загрузить файлы, используя FileUtils.copyURLToFile, внутри вызывающего потока, а также загрузить файл и затем вызвать поток. Оба случая, кажется, не имеют никакого эффекта.
Любой совет будет высоко ценится.