线程池
2017-01-04 13:01
127 查看
1.初识线程池:
根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行。
2.线程池作用:
减少创建和销毁线程的次数,每个工作线程可以多次使用
可根据系统情况调整执行的线程数量,防止消耗过多内存
3.使用
ExecutorService:线程池接口
ExecutorService pool = Executors.常见线程
eg:ExecutorService pool = Executors.newSingleThreadExecutor();
4.常见线程池
①newSingleThreadExecutor
单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
②newFixedThreadExecutor(n)
固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用)
可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④newScheduleThreadExecutor
大小无限制的线程池,支持定时和周期性的执行线程
5.实例
publicclassMyThread extends Thread {
@Override
publicvoid run() {
System.out.println(Thread.currentThread().getName() + "执行中。。。");
}
}
①newSingleThreadExecutor
publicclassTestSingleThreadExecutor {
publicstaticvoid main(String[] args) {
//创建一个可重用固定线程数的线程池
ExecutorService pool = Executors. newSingleThreadExecutor();
//创建实现了Runnable接口对象
Thread tt1 = new MyThread();
Thread tt2 = new MyThread();
Thread tt3 = new MyThread();
Thread tt4 = new MyThread();
Thread tt5 = new MyThread();
//将线程放入池中并执行
pool.execute(tt1);
pool.execute(tt2);
pool.execute(tt3);
pool.execute(tt4);
pool.execute(tt5);
//关闭
pool.shutdown();
}
}
result:
pool-1-thread-1执行中。。。
pool-1-thread-1执行中。。。
pool-1-thread-1执行中。。。
pool-1-thread-1执行中。。。
pool-1-thread-1执行中。。。
②newFixedThreadExecutor(n)
publicclass TestFixedThreadPool {
publicstaticvoid main(String[] args) {
//创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//创建实现了Runnable接口对象
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
fc71
pool.execute(t4);
pool.execute(t5);
//关闭线程池
pool.shutdown();
}
}
result:
pool-1-thread-1执行中。。。
pool-1-thread-2执行中。。。
pool-1-thread-1执行中。。。
pool-1-thread-2执行中。。。
pool-1-thread-1执行中。。。
③newCacheThreadExecutor
publicclass TestCachedThreadPool {
publicstaticvoid main(String[] args) {
//创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newCachedThreadPool();
//创建实现了Runnable接口对象
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
//关闭线程池
pool.shutdown();
}
}
result:
pool-1-thread-1执行中。。。
pool-1-thread-2执行中。。。
pool-1-thread-4执行中。。。
pool-1-thread-3执行中。。。
pool-1-thread-5执行中。。。
根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行。
2.线程池作用:
减少创建和销毁线程的次数,每个工作线程可以多次使用
可根据系统情况调整执行的线程数量,防止消耗过多内存
3.使用
ExecutorService:线程池接口
ExecutorService pool = Executors.常见线程
eg:ExecutorService pool = Executors.newSingleThreadExecutor();
4.常见线程池
①newSingleThreadExecutor
单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
②newFixedThreadExecutor(n)
固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用)
可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④newScheduleThreadExecutor
大小无限制的线程池,支持定时和周期性的执行线程
5.实例
publicclassMyThread extends Thread {
@Override
publicvoid run() {
System.out.println(Thread.currentThread().getName() + "执行中。。。");
}
}
①newSingleThreadExecutor
publicclassTestSingleThreadExecutor {
publicstaticvoid main(String[] args) {
//创建一个可重用固定线程数的线程池
ExecutorService pool = Executors. newSingleThreadExecutor();
//创建实现了Runnable接口对象
Thread tt1 = new MyThread();
Thread tt2 = new MyThread();
Thread tt3 = new MyThread();
Thread tt4 = new MyThread();
Thread tt5 = new MyThread();
//将线程放入池中并执行
pool.execute(tt1);
pool.execute(tt2);
pool.execute(tt3);
pool.execute(tt4);
pool.execute(tt5);
//关闭
pool.shutdown();
}
}
result:
pool-1-thread-1执行中。。。
pool-1-thread-1执行中。。。
pool-1-thread-1执行中。。。
pool-1-thread-1执行中。。。
pool-1-thread-1执行中。。。
②newFixedThreadExecutor(n)
publicclass TestFixedThreadPool {
publicstaticvoid main(String[] args) {
//创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//创建实现了Runnable接口对象
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
fc71
pool.execute(t4);
pool.execute(t5);
//关闭线程池
pool.shutdown();
}
}
result:
pool-1-thread-1执行中。。。
pool-1-thread-2执行中。。。
pool-1-thread-1执行中。。。
pool-1-thread-2执行中。。。
pool-1-thread-1执行中。。。
③newCacheThreadExecutor
publicclass TestCachedThreadPool {
publicstaticvoid main(String[] args) {
//创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newCachedThreadPool();
//创建实现了Runnable接口对象
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
//关闭线程池
pool.shutdown();
}
}
result:
pool-1-thread-1执行中。。。
pool-1-thread-2执行中。。。
pool-1-thread-4执行中。。。
pool-1-thread-3执行中。。。
pool-1-thread-5执行中。。。
相关文章推荐
- Android 不同手机的cpu架构不同导致的一系列第三方sdk调用出问题的解决办法
- 关系代数表达式总结
- hadoop权威指南 ShowFileStatusTest的运行调试
- 同名参数
- 了解kafka
- JavaScipt 样式操作
- 教你一招:解决win10/win8.1系统在安装、卸载软件时出现2502、2503错误代码的问题
- 实验五Activity回传数据与内部存储
- Linux之基本文本处理工具(一)
- 2016五大开源项目
- 那些年,你所经历的运维
- 国内新闻
- 三大范式+BCNF
- rich:datatable和 rich:subtable区别
- 企业运维——机房建设的一些建议
- Does Block Recovery use Incremental Backups?? (文档 ID 727706.1)
- 网络程序设计课程项目总结
- Hadoop的单机伪分布式搭建和运行第一个WordCount程序
- Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
- PAT乙级 1009