美文网首页
Java线程池的使用

Java线程池的使用

作者: yehongyu_2018 | 来源:发表于2019-01-04 15:53 被阅读0次

线程类型:

  1. 固定线程
  2. cached线程
  3. 定时线程

固定线程池使用

public class WorkerService {
private ExecutorService executorService;
Map<Integer, Worker> workerMap = new HashMap();
public boolean init() {
    int workerNum = 3;
    executorService = 
    Executors.newFixedThreadPool(workerNum);
    IntStream.range(0, workerNum).forEach(id -> {
                    Worker worker = new Worker(id);
                    workerMap.put(id, worker);
                    executorService.submit(worker);
                }
        );
    }
public void close() {
        workerMap.forEach((k, v) -> v.stop());
        //shutdown the consumer thread
        if (executorService != null) {
            // disable new tasks from being submitted
            executorService.shutdown();
            try {
                // wait a while for existing tasks to terminate
                if (!executorService.awaitTermination(60000, TimeUnit.MILLISECONDS)) {
                    LOGGER.error("Still waiting...");
                    executorService.shutdownNow(); // cancel currently executing tasks
                    // Wait a while for tasks to respond to being cancelled
                    if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
                        LOGGER.error("Pool did not terminate");
                    }
                }
            } catch (InterruptedException e) {
                LOGGER.error("force to interrupted");
                return;
            }
            LOGGER.info("Exiting normally...");
        }
    }
}
private class Worker implements Runnable {
        int id;
        private volatile boolean isRunning;
        Worker(int i) {
            id = i;
            isRunning = true;
        }
        @Override
        public void run() {
                while (isRunning) {
                    try {
                          // TODO
                     } catch (Exception e) {
                     }
                }
          }
        public void stop() {
            isRunning = false;
        }
    }

cache线程池使用

public class ConsumingExecutor {
    private Map<String, List<ConsumingWorker>>       workerMap = new HashMap<>();
    private ExecutorService executor;
    public ConsumingExecutor() {
    }
    public void start(int workerNum) {
        int workerNum = 10;
        ThreadFactory tf = new ThreadFactoryBuilder()
                .setNameFormat("ConsumingWorker-thread-%d")
                .setUncaughtExceptionHandler(new LoggingExceptionHandler())
                .build();
        executor = Executors.newCachedThreadPool(tf);
        Runtime.getRuntime().addShutdownHook(new Thread(ConsumingExecutor.this::shutdown));
    }

    public void addWorker(String key, KafkaTopic topic, ElementBlockingQueue queue, PipelineHolder.PipelineType pipelineType) {
        for (int i = 0; i < CONSUMING_WORKER_NUM; ++i) {
            ConsumingWorker consumingWorker = new ConsumingWorker(i, topic, queue, pipelineType);
            executor.submit(consumingWorker);
            if (!workerMap.containsKey(key)) {
                List<ConsumingWorker> workers = new ArrayList<>();
                workerMap.put(key, workers);
            }
           workerMap.get(key).add(consumingWorker);
        }
    }
    public void removeWorker(String key) {
        if (workerMap.containsKey(key)) {
            List<ConsumingWorker> workers = workerMap.get(key);
            workers.forEach(worker -> {
                worker.shutdown();
            });
            workerMap.remove(key);
        }
    }

    public void updateWorker(String key, KafkaTopic topic, ElementBlockingQueue queue, PipelineHolder.PipelineType pipelineType) {
        removeWorker(key);
        addWorker(key, topic, queue, pipelineType);
    }
    public void shutdown() {
        workerMap.entrySet().stream().forEach(workers -> {
            if (workers.getValue() != null) {
                workers.getValue().forEach(worker -> {
                    worker.shutdown();
                });
            }
        });

        if (null != executor && !executor.isTerminated() && !executor.isShutdown()) {
            executor.shutdown();
            try {
                if (!executor.awaitTermination(EXECUTOR_TERMINATION_WAIT_SEC, TimeUnit.SECONDS)) {
                    executor.shutdown();
                    if (!executor.awaitTermination(EXECUTOR_TERMINATION_WAIT_SEC, TimeUnit.SECONDS)) {
                        LOGGER.error("ConsumingExecutor did not terminate");
                    }
                }
            } catch (Exception e) {
                LOGGER.error("Waiting active task termination fails.");
            }
        }
    }

}

定时调度线程池使用

public class CleanService {
    private ScheduledExecutorService executor;
    public void init(ServiceConfig serviceConfig) {
        executor =     Executors.newScheduledThreadPool(cleanerNumber);
        executor.scheduleWithFixedDelay(
                    new ACleanerTask(expiryDate.longValue(), clientExpiryDate.longValue(), offset.longValue()),
                    initalDelay,
                    scanInterval,
                    TimeUnit.SECONDS);

        executor.scheduleWithFixedDelay(new BCleanerTask(expiryDate),
                    initalDelay,
                    scanInterval,
                    TimeUnit.SECONDS);

    }

    public void close() {
        if (null != executor && !executor.isTerminated() && !executor.isShutdown()) {
            LOGGER.info("close clean executor ..");
            executor.shutdownNow();
        }
    }
}

相关文章

  • 线程

    Java 并发编程:线程池的使用 Java 并发编程:线程池的使用java 多线程核心技术梳理 (附源码) 本文对...

  • Java线程池解析

    参考文章:Java并发:线程池,饱和策略 前言 Java线程池的使用在工作中还是比较常见的,线程池可以减小线程建立...

  • 零碎知识点整理

    sofa结构体系:多模块 sofa中使用sofa线程池 Java 线程池的使用非常广泛,目前有两类广泛使用的线程池...

  • 线程池

    线程池 原创 无尘粉笔 粉笔社区 昨天 Java线程池的Executors的使用 Java通过Executors提...

  • Java并发编程:线程池的使用

    Java并发编程:线程池的使用

  • Java 线程池

    Java线程池是java cocurrent包下提供的类,使用非常方便。本文希望整理下Java 线程池相关的知识以...

  • java 线程池

    java 线程池 Java 的 concurrent 包下提供了多种线程池的实现,使用起来非常方便 Executo...

  • Java/Android中的线程池,看这一篇就够了!(超详细)

    一、为何要使用线程池 在Java中,要使用多线程,除了使用new Thread()之外,还可以使用线程池Execu...

  • springboot线程池创建及使用

    springboot启动类(Application.java)中配置线程池大小 使用类中注入线程池并使用

  • Java线程池总结

    本篇文章讲述Java中的线程池问题,同样适用于Android中的线程池使用。本篇文章参考:Java线程池分析,Ja...

网友评论

      本文标题:Java线程池的使用

      本文链接:https://www.haomeiwen.com/subject/wnzhrqtx.html