建立執行緒池的一種方式
阿新 • • 發佈:2019-01-26
建立執行緒池保證為每個執行緒指定名稱,並對執行緒池定製異常策略。
private final String name; private final Map<Integer, ExecutorService> executorServiceMap; private final int channelCount = 10; private final int channelBuffer = 20; @Override public final void submit(T task) { ExecutorService executorService = getExecutorService(task); executorService.submit(task); } private ExecutorService getExecutorService(T task){ return this.executorServiceMap.computeIfAbsent(getIndex(task.shardingKey()), this::createExecutorService); } private ExecutorService createExecutorService(Integer index){ BasicThreadFactory basicThreadFactory = new BasicThreadFactory.Builder() .daemon(true) .namingPattern(name + "-Task-Executor-Channel-" + index + "-Thread-%d") .uncaughtExceptionHandler((t, e) -> LOGGER.error("failed to run task on thread {}.",t, e)).build(); return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(channelBuffer), basicThreadFactory, new ThreadPoolExecutor.CallerRunsPolicy() ); } private Integer getIndex(Long uid){ return Math.abs(uid.intValue()) % channelCount; }