限制Java线程池运行线程以及等待线程数量的策略
2016-10-09 00:00
316 查看
对于
我们有可能面临如下的场景,主线程不断地提交任务线程,希望有固定数量的在线程中运行,也不想造成线程在内存中大量的等待堆积。由此需要我们自己定义一个线程池策略。
首先看
可以看到,FixedThreadPool绑定的是
第二个是采用CallerRunsPolicy。ThreadPoolExecutor可以定义不同的任务拒绝策略。CallerRunsPolicy指的是当线程池拒绝该任务的时候,线程在本地线程直接
代码中定义了大小为10的线程池,for循环提交了100个线程的时候,10个执行线程,10个线程放入了
java.util.concurrent.Executors所提供的
FixedThreadPool,可以保证可以在内存中有固定数量的线程数运行。但是由于
FixedThreadPool绑定的是
LinkedBlockingQueue。队列的上限没有限制(默认上限为
Integer.MAX_VALUE),不断的提交新的线程,会造成任务在内存中长时间的堆积。
我们有可能面临如下的场景,主线程不断地提交任务线程,希望有固定数量的在线程中运行,也不想造成线程在内存中大量的等待堆积。由此需要我们自己定义一个线程池策略。
ThreadPoolExecutor为我们线程池的设置提供了很大的灵活性。
首先看
FixedThreadPool的实现:
public static ExecutorService More ...newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory); }
可以看到,FixedThreadPool绑定的是
LinkedBlockingQueue<Runnable>。我们需要做的第一个改造就是绑定有大小上线的BlockingQueue,在我的实现中绑定
ArrayBlockingQueue<Runnable>并设置了size。
第二个是采用CallerRunsPolicy。ThreadPoolExecutor可以定义不同的任务拒绝策略。CallerRunsPolicy指的是当线程池拒绝该任务的时候,线程在本地线程直接
execute。这样就限制了本地线程的循环提交流程。
BlockingQueue<Runnable> workingQueue = new ArrayBlockingQueue<Runnable>(10); RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); ExecutorService threadPool = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, workingQueue, rejectedExecutionHandler); for (int i = 0; i < 100; i++) { threadPool.submit(new Callable<Boolean>() { @Override public Boolean call() throws Exception { System.out.println("thread " + String.valueOf(threadNo) + " is called"); Thread.sleep(10000); System.out.println("thread " + String.valueOf(threadNo) + " is awake"); throw new Exception(); }
代码中定义了大小为10的线程池,for循环提交了100个线程的时候,10个执行线程,10个线程放入了
workingQueue。当提交到第21个线程的时候,会触发RejectedExecutionHandler。在这里我们配置了CallerRunsPolicy策略。所以会在主线程直接执行该线程。也就是说,在本程序中最多会有11个线程在执行,10个线程在等待。由此限制了线程池的等待线程数与执行线程数。
相关文章推荐
- 线程系列09,线程的等待、通知,以及手动控制线程数量
- 多线程以及主线程等待并发子线程运行
- 查看进程运行在哪个CORE上以及进程下线程数量
- 多线程学习之限制同时运行的线程数量
- 多线程学习之限制同时运行的线程数量
- OpenMP中几个容易混淆的函数(线程数量/线程ID/线程最大数)以及并行区域线程数量的确定
- 线程通信(子线程运行10次,主线程运行100次,如此循环50次)[用condition替代wait,notify等待和唤醒操作]
- CLR 无法从 COM 上下文 0x1a2740 转换为 COM 上下文 0x1a28b0,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作
- C++类的静态成员函数在多线程的工作机制以及运行过程中强制结束线程实验
- 软件限制策略的简单应用应用简单策略限制软件运行所有
- 应用SELinux中的目标策略限制进程运行
- 如何限制同一客户端登录的用户数量以及禁止同一用户同时在不同客户端登录?
- 破解安卓软件中金币数量的限制以及反编译安卓软件的思路
- Win2003中用组策略限制域中客户端运行的软件
- 如何限制同一客户端登录的用户数量以及禁止同一用户同时在不同客户端登录? (转)
- java中对线程的实现 等待多个子线程结束 多个子线程运行中进行同步
- Windows待机、休眠、睡眠的区别以及程序运行策略
- 组策略限制QQ运行
- 提高系统运行速度,阻止木马病毒程序运行 软件限制策略
- 程序运行时三种内存分配策略:静态的、栈式的、和堆式的,以及区别