private ExecutorService createPriorityExecutor(ScanExecutorConfig sec, Map<String,Queue<?>> scanExecQueues) { BlockingQueue<Runnable> queue; if (sec.prioritizerClass.orElse("").isEmpty()) { queue = new LinkedBlockingQueue<>(); } else { ScanPrioritizer factory = null; try { factory = ConfigurationTypeHelper.getClassInstance(null, sec.prioritizerClass.get(), ScanPrioritizer.class); } catch (Exception e) { throw new RuntimeException(e); } if (factory == null) { queue = new LinkedBlockingQueue<>(); } else { Comparator<ScanInfo> comparator = factory.createComparator(() -> sec.prioritizerOpts); // function to extract scan scan session from runnable Function<Runnable,ScanInfo> extractor = r -> ((ScanSession.ScanMeasurer) ((TraceRunnable) r) .getRunnable()).getScanInfo(); queue = new PriorityBlockingQueue<>(sec.maxThreads, Comparator.comparing(extractor, comparator)); } } scanExecQueues.put(sec.name, queue); return createEs(() -> sec.getCurrentMaxThreads(), "scan-" + sec.name, queue, sec.priority); }