class ConcurrentEvictionListener extends QueuingEvictionListener<K, V> {

  protected void init(int queueSize, int concurrencyLevel) {
    cacheTasks = new ArrayBlockingQueue<>(queueSize);
    final ExecutorService drainerService = Executors.newFixedThreadPool(concurrencyLevel,
        runnable -> ThreadUtils
            .createDaemonThread(runnable, "imcache:concurrentAsyncEvictionDrainer(thread="
                + NO_OF_EVICTION_DRAINERS.incrementAndGet() + ")"));
    // Creates runnables to drain cache task queue constantly.
    for (int i = 0; i < concurrencyLevel; i++) {
      drainerService.execute(() -> {
        while (true) {
          drainQueue();
        }
      });
    }
  }

  public  ConcurrentEvictionListener();
  public  ConcurrentEvictionListener(final int batchSize, final int queueSize,
      final int concurrencyLevel);

}