线程并发库<二>_线程池
2013-10-17 06:14
232 查看
线程池
六、线程池
前言:在以前创建一个线程时,总是要手动创建一个线程,然后启动运行;并且一旦线程运行结束后,就作废;当要运行的线程数过多时,这种创建方式的弊端便会很明显。就好比一个公司接待客户,当每个客户需要服务时,就去招聘一个员工来给该客户服务,当服务完毕后就解雇该员工,这显然不符合客观事实。同理,当线程数过多时,传统的创建线程方式有局限性。
在JDK1.5版本以后,Java提供了线程池,对应的API为Executors,创建一个线程池时,可以指定里面含有几个线程。当要执行某些任务时,可以直接把这些任务放到线程池中,即可。线程池会按照它容量的大小循环执行完这些任务。就好比一个公司中有固定的员工数量,不管来了多少的客户,只要该公司的员工有空,都会去接待这些客户,当员工没空时,客户等待,这就提高了一个员工的使用次数,同理,线程池中的线程也可以使用多次。
在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程,这就是封装。任务是提交给整个线程池,一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
更多详细的介绍请查阅API文档,在此只做大概的介绍,下面代码体现:
六、线程池
前言:在以前创建一个线程时,总是要手动创建一个线程,然后启动运行;并且一旦线程运行结束后,就作废;当要运行的线程数过多时,这种创建方式的弊端便会很明显。就好比一个公司接待客户,当每个客户需要服务时,就去招聘一个员工来给该客户服务,当服务完毕后就解雇该员工,这显然不符合客观事实。同理,当线程数过多时,传统的创建线程方式有局限性。
在JDK1.5版本以后,Java提供了线程池,对应的API为Executors,创建一个线程池时,可以指定里面含有几个线程。当要执行某些任务时,可以直接把这些任务放到线程池中,即可。线程池会按照它容量的大小循环执行完这些任务。就好比一个公司中有固定的员工数量,不管来了多少的客户,只要该公司的员工有空,都会去接待这些客户,当员工没空时,客户等待,这就提高了一个员工的使用次数,同理,线程池中的线程也可以使用多次。
在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程,这就是封装。任务是提交给整个线程池,一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
更多详细的介绍请查阅API文档,在此只做大概的介绍,下面代码体现:
package itheima.thread.day01; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ThreadPoolTest { public static void main(String[] args) { // 工具类一般带s,里面提供一大堆静态方法 // 固定线程数的线程池 // ExecutorService threadPool= Executors.newFixedThreadPool(3); // 带缓冲的线程池 // ExecutorService threadPool= Executors.newCachedThreadPool(); // 创建单独的一个线程,没有池的概念 ExecutorService threadPool= Executors.newSingleThreadExecutor(); // 线程池中只有三个线程,只能三个服务完了才服务其他的线程 for(int i=1;i<=10;i++){ final int task = i; threadPool.execute(new Runnable(){ @Override public void run() { for(int j=1;j<=10;j++){ try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" loop of "+j+" for task of "+task); } } }); } // 关闭线程池中的所有线程 // threadPool.shutdown(); // 定时器 // Executors.newScheduledThreadPool(3).schedule( Executors.newScheduledThreadPool(3).scheduleAtFixedRate( new Runnable() { @Override public void run() { System.out.println("bombing......"); } }, 2, 3, TimeUnit.SECONDS); } }
相关文章推荐
- Combination Sum
- struts2的工作流程(易懂版)
- 白首方恨读书迟
- 解决EF一对一或多对一的删除
- java 关于操作oracle的clob类型
- 有关 C 指针的个人另类概念(1)
- Java is Pass-by-Value, Dammit!
- linux服务器安全加固shell脚本
- nodejs广播
- Best Time to Buy and Sell Stock
- 函数1(四)
- nodejs服务
- 【学习】linux shell 编程
- RHEL6.4更改为CentOS6.4的yum源
- 单链表操作大全
- 在 php 中通过 CURL 上传文件
- 一句话经典总结红黑树插入
- 小流涓涓成江海,拙技点点构平台——多线程开发
- 英文面试自我介绍
- RHEL6安装图形界面