1,Java5线程池
线程池的概念与Executors类的应用
首先介绍在TCP服务器编程模型的原理,当一个客户端连接到服务器,服务器要起一个线程为之服,当客户端的回话结束时,线程也就结束了,即每一个客户端连接,服务器 就要为之创建一个新的线程,这好比假设每个报名学员都要通过我来亲自接 待,以便给每个学员一种好的感觉,但每个学员报名手续花费半个小时,对于 50名学生,我一个个接待和为之办手续,显然是不实际的,那么我会怎么做呢
?我会先接待每个学员,打完招呼后,再把他分配给一名工作人员去办理手续 ,这样我就接待了每一名学员.
如果访问服务器的客户端很多,那么服务器要不断的创建和销毁线程, 这样将严重影响服务器的性能,如果真的来一名学员,我们就安排一名新的 工作人员为之服务,这也是不可能的,那么公司岂不是要招很多工作人员.
应该是一名工作人员服务完一名学员,空闲下来后,一旦有新的学员要服务,
我们安排该工作人员,为之服务.
线程池的概念于此类似,首先创建一些线程,他们的集合称为线程池,
当服务器接收到一个客户请求后,就从线程池中取出一个空闲的线程为之服
务,服务完成后不关闭该线程,而是将该线程还回到线程池中.
在线程池的编程模式下,任务是交给整个线程池,而不是直接交给某个线
程,线程池拿到任务偶,他就在内部找有空闲的线程,再把任务交给内部某个
空闲的线程,这就是封装.记住,任务是交给整个线程池,但可以同时向一个线程池中提交多个任务.
创建固定大小的线程池:
ExecutorService threadPool = Executors.newFixedThreadPool(3);
threadPool.execute(Runnable runnable);
创建缓存的线程池:
如果线程不够自动创建新的线程满足服务
ExecutorService threadPool = Executors.newCachedThreadPool();
threadPool.execute(Runnable runnable);
创建单一线程池.
线程里面只有一个线程,如果该线程意外死亡,那么系统会自动创建一个新的线程来代替.
ExecutorService threadPool = Executors.newSingleThreadExecutor();
threadPool.execute(Runnable runnable);
//执行完任务后关闭线程池,
threadPool.shutdown();
//不管任务是否完成都关闭线程池
threadPool.shutdownNow();
用线程池启动定时器.
Executors.newScheduledThreadPool(3).schedule(newRunnable(){
@Override
publicvoidrun() {
}
}, 20,TimeUnit.SECONDS);
2,Callable和Future的用法
通过这两个类可以得到线程执行后返回的结果.
ExecutorService executorService = Executors.newSingleThreadExecutor();
//通过submit方法提交任务
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "hello world";
}
});
System.out.println("等待返回的结果");
try {
System.out.println("返回的结果,"+future.get());
} catch (Exception e) {
e.printStackTrace();
}
Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的.
submit()方法返回的Future对象可以取消任务.
CompletionService用于提交一组Callable任务,其take()方法返回已完成的一个Callable任务对应的Future对象
ExecutorService executorService2 = Executors.newFixedThreadPool(3);
CompletionService<Integer> service = new ExecutorCompletionService<Integer>(
executorService2);
for (int i = 0; i < 10; i++) {
final int k = i;
service.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Thread.sleep(new Random().nextInt(5000));
return k;
}
});
}
try {
for(int i = 0; i < 10; i++){
System.out.println(service.take().get());
}
} catch (Exception e) {
e.printStackTrace();
}
转载请注明出处: http://blog.csdn.net/johnny901114/article/details/8695693
分享到:
相关推荐
在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。.......................................JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺JAVA线程、...
java多线程,对多线程,线程池进行封装,方便使用
Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:...
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...
JAVA使用线程池查询大批量数据
Java多线程编程,生命游戏,用线程池.zipJava多线程编程,生命游戏,用线程池.zip Java多线程编程,生命游戏,用线程池.zipJava多线程编程,生命游戏,用线程池.zip Java多线程编程,生命游戏,用线程池.zipJava多...
java多线程并发查询数据库,使用线程池控制分页,并发查询。
Java 多线程与并发(17_26)-JUC线程池_ FutureTask详解
本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...
Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、延迟连接池 五、单任务延迟连接池 六、自定义线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上...
目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来模拟真实的QQ实时聊天软件。因为涉及到Socket编程,所以一定会使用多...
计算机后端-Java-Java核心基础-第20章 多线程 20. 创建多线程的方式四:使用线程池.avi
Java线程池及观察者模式解决多线程意外死亡重启问题,附件含两个要运行代码!
计算机后端-Java-Java核心基础-第20章 多线程 19. 使用线程池的好处.avi
刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...
* 使用多线程的好处: 1.降低消耗,减少了创建和销毁线程的次数,每个线程都可以重复利用,可执行多个任务 2.提高响应速度,任务可以不需要等到线程创建就可以立即执行 3.提高线程的可管理性,根据系统的承受能力,...