Задача - сделать так, чтобы экзекутор блокировался до того момента, пока нет тасков. Или выполнял таску сам.
BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<Runnable>(10); RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); ExecutorService excutorService = new ThreadPoolExecutor(2, 2, 0L, TimeUnit.MILLISECONDS, blockingQueue, rejectedExecutionHandler);
Созданный таким образом экзекутор будет выполнять таски сам, когда очередь ожидающих тасков полна, вместо того, чтобы кинуть RejectedExecutionException при следующем сабмите.
Другой способ, это использовать семафор, поток, который сабмитит таску, заблокируется
final Semaphore semaphore = new Semaphore(bound); try { semaphore.acquire(); executor.execute(new Runnable() { public void run() { try { command.run(); } finally { semaphore.release(); } } }); } catch (Exception e) { semaphore.release(); }
Комментариев нет:
Отправить комментарий