线程池
2016-02-27 14:55
148 查看
Java线程池
* 线程池的重要性: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大降低系统的效率,因为创建和销毁都需时间
* 所以在Java中可以通过线程池来达到使线程复用,执行完一个任务之后并不会被销毁 在Java中实现线程池的类 ThreadPoolExecutor
*
* Java通过Executor提供四种线程池
* 1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收空闲线程,则新建线程
* 2、newFixedThreadPool 创建一个定长(长度固定)线程池,可控制线程最大并发数,超出的线程会在队列中等待
* 3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
* 4、newSingleThreadPool
* 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,从而保证所有任务按照指定顺序执行
1、newCachedThreadPool
//该线程池为无限大,当执行第二个任务时,第一个任务已经完成,所以会去复用执行第一个任务的线程,而不用每次新建线程。
2、newFixedThreadPool
3、newScheduledThreadPool 延迟执行
newScheduledThreadPool 定期执行
4、newSingleThreadExecutor
* 线程池的重要性: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大降低系统的效率,因为创建和销毁都需时间
* 所以在Java中可以通过线程池来达到使线程复用,执行完一个任务之后并不会被销毁 在Java中实现线程池的类 ThreadPoolExecutor
*
* Java通过Executor提供四种线程池
* 1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收空闲线程,则新建线程
* 2、newFixedThreadPool 创建一个定长(长度固定)线程池,可控制线程最大并发数,超出的线程会在队列中等待
* 3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
* 4、newSingleThreadPool
* 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,从而保证所有任务按照指定顺序执行
1、newCachedThreadPool
ExecutorService cachedThreadPool ; cachedThreadPool = Executors.newCachedThreadPool(); for(int i=0;i<20;i++){ final int index = i; try{ //Thread.sleep(1000); } catch(Exception ex){ ex. printStackTrace(); } cachedThreadPool.execute( new Runnable(){ public void run() { // TODO Auto-generated method stub System. out.println(index); System. out.println("使用的线程编号是:" +Thread.currentThread ().getId()); } }); }
//该线程池为无限大,当执行第二个任务时,第一个任务已经完成,所以会去复用执行第一个任务的线程,而不用每次新建线程。
2、newFixedThreadPool
ExecutorService fixedThreadPool; fixedThreadPool = Executors.newFixedThreadPool(5); for(int i=0;i<20;i++){ final int index=i; fixedThreadPool.execute( new Runnable(){ public void run() { // TODO Auto-generated method stub try{ System. out.println(index); System. out.println("使用的线程编号是:" +Thread.currentThread ().getId()); } catch(Exception ex){ ex.printStackTrace(); } } }); }
3、newScheduledThreadPool 延迟执行
ScheduledExecutorService scheduledThreadPool; scheduledThreadPool = Executors.newScheduledThreadPool(3); System. out.println("开始执行" ); scheduledThreadPool.schedule( new Runnable() { public void run() { // TODO Auto-generated method stub System. out.println("延迟3秒执行,使用的线程编号是:" + Thread.currentThread().getId()); } }, 1000, TimeUnit. MILLISECONDS);
newScheduledThreadPool 定期执行
ScheduledExecutorService scheduledThreadPool; scheduledThreadPool = Executors.newScheduledThreadPool(3); System. out.println("开始执行" ); scheduledThreadPool.scheduleAtFixedRate( new Runnable() { public void run() { // TODO Auto-generated method stub System. out.println("你好啊!我现在用的线程编号是:" + Thread.currentThread().getId()); } }, 5, 2, TimeUnit. SECONDS); // 延迟5秒后,每隔2秒执行一次
4、newSingleThreadExecutor
ExecutorService singleThreadExecutor; singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute( new Runnable() { public void run() { // TODO Auto-generated method stub System. out.println(index); System. out.println( "正在使用线程" +Thread.currentThread ().getId()); // System.out.println("正在打印" + index + ",使用的线程编号是:" // + Thread.currentThread().getId()); // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } }); //通过结果,可以看出打印的顺序是依次执行的,相当于顺序执行每一个任务
相关文章推荐
- [maya学习笔记(13)] 合并 补洞
- Redis事务测试
- OkHttp使用教程
- Eclipse中同时打开多个Console
- 在Linux(ubuntu server)上面安装NodeJS的正确姿势
- android 性能优化-电量篇
- Sublime Text 3必备插件
- Tornado设置数据库的Timezone
- git解决分支冲突
- vc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element
- Word中插入带公式的Visio注意事项
- 用CocoaPods和ReactiveCocoa的安装
- 归并排序及利用归并排序求逆序对数
- vs在不同版本的opencv之间切换
- poj-3112 Pie
- Centos6 安装mysql5.6 以及ERROR 2002 ERROR 1045 解决方法
- 修改Tomcat Connector运行模式,优化Tomcat运行性能
- tomcat
- UGUI运用美术字体
- iOS 定位失败 非洲 经纬度为0,0