Java线程池
来源:互联网 发布:中华软件 编辑:程序博客网 时间:2024/06/05 17:33
我们平时在写程序中常常使用多线程来提高CPU以及其他资源的利用率,但是当CPU中的线程超过了CPU调度范围时,我们的程序就会变得缓慢甚至出现死锁 导致程序卡死等现象。也有很多时候我们需要创建的线程量巨大,但是每个线程的执行时间却相对较小,这样在新启线程和关闭线程的时候消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。除了创建和销毁线程的开销之外,活动的线程也消耗系统资源。在一个JVM 里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”。
线程池的出现能较好的解决以上问题,线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个 任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通 过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源 不足。
在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解的是java.util.concurrent.Executors类的API,这个类提供了四种比较常用线程池。
1.newCachedThreadPool
newCachedThreadPool()是根据需求创建新线程的,需求多时,创建的就多,需求少时,JVM自己会慢慢的释放掉多余的线程,它是一种可变尺寸的线程池。
ExecutorService threadPool = Executors.newCachedThreadPool();for(int i=0;i<5;i++){MyThread t = new MyThread();threadPool.execute(t);}
运行结果:
2.newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。新的线程加入后,如果正在运行的线程达到了上限,则会阻塞,直到有了空闲的线程来运行。他是定长尺寸的线程池。
ExecutorService threadPool = Executors.newFixedThreadPool(3);
此时线程池的最大线程为3,运行效果:
3.newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); MyThread t3 = new MyThread(); // 将线程放入池中进行执行 scheduledThreadPool.execute(t1); // 使用延迟执行风格的方法 scheduledThreadPool.schedule(t2, 1000, TimeUnit.MILLISECONDS); scheduledThreadPool.schedule(t3, 10, TimeUnit.MILLISECONDS);
最多只能运行两个2个线程,延迟效果自行体会,运行结果:
4.newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
ExecutorService threadPool = Executors.newSingleThreadExecutor();
只会运行一个线程,运行效果:
- Java线程:线程池
- java--线程--线程池
- Java线程(六):线程池
- Java线程(五):线程池
- Java线程(五):线程池
- Java线程_07_线程池
- Java线程(五):线程池
- Java线程(六):线程池
- Java线程(五):线程池
- Java线程(六):线程池
- Java线程(六):线程池
- Java线程(六):线程池
- Java线程(六):线程池
- Java线程(六):线程池
- Java线程(六):线程池
- Java线程(六):线程池
- Java线程(五):线程池
- Java线程(六):线程池
- 通过后台静态表的值来决定是否显示div
- IPC Mechanism on linux
- Java复习笔记(一)——Java的运行机制
- DBCP连接池介绍
- Android侧滑菜单的使用和配置(SlidingMenu)
- Java线程池
- 总结OnOK()、OnCancel()、OnClose()、OnDestroy()之间的区别(转)
- Eclipse插件开发之ActionSet分割符
- 一个程序员的Java和C++学习之路(整理)
- 在pc端,分享功能
- Entity Framework 无法对没有主键的视图映射实体的解决办法
- Mysql数据库导入Sqlite
- 视频会议及流媒体十大开源项目
- 经纬度如何在mysql 数据库中定义数据类型.