java提供的线程池的使用
2017-01-12 16:48
330 查看
应用场景,比如你有个业务模块,非常耗时,并且还需要重复调用5次。
如果你写个for循环调用5次,调用一次3秒,那么5次就15秒,不是很友好。
这时,如果你用线程池就方便了,多线程跑,都跑完,收集到结果,也就是一个任务的时间。
Demo:
我们故意让前边的sleep时间长点,让后边的先执行。
结果:
跑完发现List<Future> list中存放的顺序还是按照原顺序来的,所以不用担心顺序问题。
如果你写个for循环调用5次,调用一次3秒,那么5次就15秒,不是很友好。
这时,如果你用线程池就方便了,多线程跑,都跑完,收集到结果,也就是一个任务的时间。
Demo:
package com.tech.jin.thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class TestThread { public void test(){ int threadCount = 5;//创建线程数 ExecutorService executorService = Executors.newFixedThreadPool(threadCount); List<Future> list = new ArrayList<Future>(); long time1 = System.currentTimeMillis(); for(int i=0;i<threadCount;i++){ //如果你有一个任务调用接口 Callable c = new testCallable(i,time1); Future f = executorService.submit(c);//这里也可以submit(Thread或Runnable) list.add(f); } for(Future f :list){ try { long time3 = (Long)f.get(); System.out.println(time3); } catch (InterruptedException e) { } catch (ExecutionException e) { e.printStackTrace(); } } } public static void main(String[] args) { TestThread t = new TestThread(); t.test(); } } class testCallable implements Callable{ private int i; private long time1; public testCallable(int i,long time1) { this.i = i; this.time1 = time1; } @Override public Object call() throws Exception { Thread.sleep(5000-(i*1000)); long time2 = System.currentTimeMillis(); long time3 = time2-time1; System.out.println(i+"------"+time3); return time3; } }
我们故意让前边的sleep时间长点,让后边的先执行。
结果:
4------1006 3------2006 2------3006 1------4005 0------5004 5004 4005 3006 2006 1006
跑完发现List<Future> list中存放的顺序还是按照原顺序来的,所以不用担心顺序问题。
相关文章推荐
- hibernate动态数据源配置(注解)
- Spark编程指南入门之Java篇六-RDD持久化介绍
- java内部类的this和new语法
- spring boot @ConditionalOnxxx相关注解总结
- 读spring源码__IOC
- 使用Java的Proxy类实现动态代理(Dynamic Proxy)
- Spring集成RabbitMQ并实现延迟队列
- 解析struts2中的valueStack
- 关于java中beanutils的自定义时间转换器的笔记
- 八、SpringMVC 注解标签大全详解
- java之String类型
- 【开发工具IDE】Eclipse相关配置
- Struts 入门(一) 搭建Struts环境
- java中的几个集合类
- 解决java后台支持ios表情
- 关于spring autowrie的5种方式
- java封装树通用方法
- jdk和jre的区别
- Springmvc 基于浏览器国际化配置及使用
- 怎么从服务器上文件拷贝下来