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


posted @ 2017-12-21 15:17  清风小妖的天空521  阅读(172)  评论(0编辑  收藏  举报