Blocking ThreadPool

Если создать экзекутор Executors.newFixedThreadPool(1) таким образом, то для задач, которые не могу быть обработаны будет использоваться безразмерная очередь, в итоге эта конструкция может уйти в OOM, например. Можно использовать блокирующую очередь, но тогда придется определить RejectionPolicy, т.е, что экзекутор должен сделать в том случае, если размер очереди ожидающих задач переполнен.

Задача - сделать так, чтобы экзекутор блокировался до того момента, пока нет тасков. Или выполнял таску сам.

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();
    }

Комментариев нет:

Отправить комментарий