zoukankan      html  css  js  c++  java
  • Java线程池简聊

    在Java中,已经实现了4中内置的线程池,这四种我不多聊。

    大家各种网站论坛都能查得到。

    现在说一下这四种线程池的基类:

    ThreadPoolExecutor
    在ThreadPoolExecutor中你可以定义自由的线程池:
    如定长线程池、可缓存线程池,现在按照我写的一个定长线程池来说一下:
    我的线程池管理类:TaskThreadPoolManager

    cachedThreadPool = new ThreadPoolExecutor(MAX_THREADPOOLSIZE, MAX_THREADPOOLSIZE, 1, TimeUnit.HOURS, queue, new ThreadPoolExecutor.CallerRunsPolicy());
    在其中主要设定了一个LinkedBlockingQueue
    这个阻塞队列对象,可以帮助我们干什么呢?
    简单理解:
    当你设定线程池的最大线程数量为maximumPoolSize时,如果有新的执行任务进来,新线程任务不被执行将会被缓存在LinkedBlockingQueue之中。
    举个栗子:
    当你从MQ接收到10个消息,有10个线程在同时处理这个消息的内容,
    当MQ又来了20个消息,而你需要等前10个消息处理完才能处理这20个消息
    如果你设定阻塞队列深度为20,那么这20条消息将会被接收,待处理的内容将会存在阻塞队列中
    同时,你可以在接收消息的线程中,判定阻塞队列的大小,从而约束服务器是否继续接收消息(避免内存挤崩)。
    所以,加上前面正在处理的10条消息,你在MQ中只接收到了30条消息。。。。。。
    说到这里,大家应该对阻塞队列的使用了如执掌了。
    那么下面,说一下JDK默认线程池暴露在外面的执行方法:
    public abstract void execute(@org.jetbrains.annotations.NotNull Runnable command);
    没错,是一个Runnable实现类,所以执行起来很简单啦:
    cachedThreadPool.execute(runnable);
    runnable就是你的线程。
    是不是够简单?
    好吧、、、我承认排版很烂,以后会加强此方面#83
    最后,问大家一个问题,你们说实现线程的两种方式哪一种更好呢?
    请忽略JDK8的线程实现方式~~~


  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/qfxydtk/p/8080730.html
Copyright © 2011-2022 走看看