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的线程实现方式~~~


  • 相关阅读:
    5-JVM常用的命令
    4-JVM 参数
    3-JVM垃圾回收算法和垃圾收集器
    2-JVM内存结构
    1-JVM基础
    非常短的git学习笔记
    白话马尔科夫链蒙特卡罗方法(MCMC)
    写了个小游戏,来玩
    胡小兔的 高考2019 游记
    机房志 | 一篇中二的文章
  • 原文地址:https://www.cnblogs.com/qfxydtk/p/8080730.html
Copyright © 2011-2022 走看看