ThreadPoolExecutor Block When Queue Is Full?

前端 未结 8 1836
无人及你
无人及你 2020-11-29 17:42

I am trying to execute lots of tasks using a ThreadPoolExecutor. Below is a hypothetical example:

def workQueue = new ArrayBlockingQueue(3, f         


        
8条回答
  •  猫巷女王i
    2020-11-29 18:24

    Ok, old thread but this is what I found when searching for blocking thread executor. My code tries to get a semaphore when the task is submitted to the task queue. This blocks if there are no semaphores left. As soon as a task is done the semaphore is released with the decorator. Scary part is that there is a possibility of losing semaphore but that could be solved with for example a timed job that just clears semaphores on a timed basis.

    So here my solution:

    class BlockingThreadPoolTaskExecutor(concurrency: Int) : ThreadPoolTaskExecutor() {
        companion object {
            lateinit var semaphore: Semaphore
        }
    
        init {
            semaphore = Semaphore(concurrency)
            val semaphoreTaskDecorator = SemaphoreTaskDecorator()
            this.setTaskDecorator(semaphoreTaskDecorator)
        }
    
        override fun  submit(task: Callable): Future {
            log.debug("submit")
            semaphore.acquire()
            return super.submit(task)
        }
    }
    
    private class SemaphoreTaskDecorator : TaskDecorator {
        override fun decorate(runnable: Runnable): Runnable {
            log.debug("decorate")
            return Runnable {
                try {
                    runnable.run()
                } finally {
                    log.debug("decorate done")
                    semaphore.release()
                }
            }
        }
    }
    

提交回复
热议问题