Giter VIP home page Giter VIP logo

threadpool4j's Introduction

在软件架构和设计中,会尽可能地将操作异步化,缩短响应时间,提升性能。

将异步任务放入线程池,这是许多人都知道的。但是当异步任务多了之后,如果全放在同一个线程池执行,会出现一些问题:

  • 不同任务因其执行的操作不同,所需时间不同。如果有大量执行时间较久的异步任务,会阻塞那些执行非常快的异步任务,导致原本很快可以完成的异步任务也变慢。
  • 操作本地内容的异步任务和操作远程内容的异步任务。如果放在同一个线程池中,在网络出现故障的情况下,会出现大量的任务积压,导致执行本地内容的异步任务也受影响。

现实生活中,机动车行驶时,会根据行驶的速度划分超车道、快车道、慢车道和应急车道,避免速度慢的车辆阻塞速度快的车辆。

车道划分

同理,将异步任务放入不同的线程池执行,就可以解决上面的两个问题。

threadpool4j是一个实现了多线程池的类库,解决了上述的问题。可指定不同的异步任务在不同的线程池中运行,不同的线程池可配置不同大小。详细的特性说明如下:

特性

1、模块稳定

  • 已在实际的业务中应用,使用多线程池模块每天执行超过3亿个异步任务,运行稳定。

2、支持多个线程池

  • 每个线程池有独立的名称,可配置不同的线程数。
  • 业务可根据异步任务的操作,将它们分发至不同的线程池,避免将所有的异步任务放在一个池中相互影响。

3、完善的统计和健康状态信息

  • 每分钟输出一次各个线程池的执行任务数和队列积压情况。
[2014-07-08 18:05:54] ~ ThreadPool:default, ActiveThread:0, TotalTask:327563397, CompletedTask:327563397, Queue:0
[2014-07-08 18:05:54] ~ ThreadPool:outer, ActiveThread:0, TotalTask:7033787, CompletedTask:7033787, Queue:0
[2014-07-08 18:05:54] ~ ThreadPool:account, ActiveThread:0, TotalTask:17359, CompletedTask:17359, Queue:0
[2014-07-08 18:05:54] ~ ThreadPool:channel, ActiveThread:0, TotalTask:7037913, CompletedTask:7037913, Queue:0
  • 每分钟输出一次各个线程池的线程状态信息。
[2014-07-08 17:36:58] ~ ThreadGroup:channel-pool, New:0, Runnable:0, Blocked:0, Waiting:30, TimedWaiting:0, Terminated:0
[2014-07-08 17:36:58] ~ ThreadGroup:outer-pool, New:0, Runnable:0, Blocked:0, Waiting:10, TimedWaiting:0, Terminated:0
[2014-07-08 17:36:58] ~ ThreadGroup:account-pool, New:0, Runnable:0, Blocked:0, Waiting:30, TimedWaiting:0, Terminated:0
[2014-07-08 17:36:58] ~ ThreadGroup:default-pool, New:0, Runnable:1, Blocked:0, Waiting:29, TimedWaiting:1, Terminated:0
  • 输出的日志信息对统计程序和统计脚本友好,容易切分。

4、使用和配置简单

  • 从多线程池模块复制biz/threadpool4j.xml配置文件,然后根据项目的实际需要简单修改即可(简单的项目不修改亦可使用)。
  • 只需一行代码就可以执行异步任务。

5、初始化和关闭所有线程池简单

  • 应用启动时,执行一行代码可初始化配置文件中所有的线程池。
  • 应用关闭时,执行一行代码可安全地关闭所有的线程池。

6、无框架依赖性

  • 不依赖特定的框架,适用于所有使用Java语言的应用。

文档

1、编译threadpool4j

2、threadpool4j入门指南

3、配置日志输出

4、版本历史

threadpool4j's People

Contributors

aofeng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

threadpool4j's Issues

找不到ThreadPoolManager

您好,在Android项目中导入源码里面的5个jar包并依赖,但是初始化的时候找不到ThreadPoolManager这个类,还有请问一个在Android项目中,配置文件放那里呢?谢谢

建议

  1. 用maven管理依赖
  2. 将log4j 日志输出改成slf4j + logback
  3. 把未开源的两个依赖改成使用开源包

报错

使用ant编译的jar包,在threadPoolManager.init()的时候报错NullPointerException: Attempt to invoke interface method 'org.w3c.dom.Element org.w3c.dom.Document.getDocumentElement(),还有请问一下,在Android项目中,配置文件应该放在哪里呢,谢谢

添加1万个任务后,一个一个执行过程中出错

比如 先有1万个任务要多线程处理,互不影响。但是我调用后执行过程中出错:
name:threadpool4j-threadstack, id:16, status:RUNNABLE, priority:5
java.lang.Thread.dumpThreads(Native Method)
java.lang.Thread.getAllStackTraces(Thread.java:1610)
cn.aofeng.threadpool4j.job.ThreadStackJob.execute(ThreadStackJob.java:26)
cn.aofeng.threadpool4j.job.AbstractJob.run(AbstractJob.java:34)
java.lang.Thread.run(Thread.java:748)

需求请教一个问题

配置xml文件时,说明为:“在应用的CLASSPATH的任意路径(如:应用的classes目录)下新建一个threadpool4j.xml的配置文件,其内容为”
这里写明了在Classpath中进行配置,但是我的是普通的执行项目,没有这个目录,于是就按照你源码上的放在conf/biz下面,报错Exception in thread "main" java.lang.IllegalArgumentException: thread pool default not exists,然后放在工程目录下也是这样,放在src目录下还是这样,不知道怎么解决,请指教下

关闭不优雅

ThreadPoolImpl.destroy调用的是ThreadPoolExecutor.shutdown方法,该方法会把线程池状态设置为SHUTDOWN,不会接收新任务,并中断线程池里空闲的线程(中断信号并不代表线程会停止,需要线程监听中断信号)。但不会阻塞等待线程池队列里的任务执行完成,这会导致队列中的任务丢弃。可以参考Spring的ThreadPoolTaskExecutor.shutdown方法,在ThreadPoolExecutor.shutdown后,执行ThreadPoolExecutor.awaitTermination等待队列中的任务完成后才停止应用。

单例问题

建议把 初始化线程池的工作放到ThreadPoolManager里,目前的设计,用户完全可以绕过ThreadPoolManager ,而初始化多个ThreadPool。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.