java线程池的使用及案例分享
来源:互联网 发布:手机淘宝如何申请试用 编辑:程序博客网 时间:2024/06/05 06:18
线程池原理及源码分析传送门
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
鉴于newCachedThreadPool及newFixedThreadPool 使用较多,略微复杂,使用不当容易导致死锁、资源不足等等情况。常见的错误使用后果有性能低下、内存溢出、服务器宕机等等。故此处只介绍这两种线程池。
下面通过一个典型的使用线程池的案例来介绍线程池的使用:
将一个问题分成 N 个部分,给每个部分建立一个独立的线程处理,当所有问题处理完毕时回归到主线程,处理这个问题的后续部分。
1. newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExecutorsTest { /** * @param args */ public static void main(String[] args) { //线程数 int num = 10; //CountDownLatch是一个同步辅助类也可以使用AtomicInteger替代 CountDownLatch doneSignal = new CountDownLatch(num); ExecutorService pool = Executors.newCachedThreadPool(); for(int i=0;i<num;i++) //在未来某个时间执行给定的命令 pool.execute(new WorkerRunnable(doneSignal, i)); try { doneSignal.await(); } catch (InterruptedException e) { e.printStackTrace(); } //子线程执行完毕,可以开始后续任务处理了 System.out.println("所有任务执行完毕"); }}class WorkerRunnable implements Runnable { private final CountDownLatch doneSignal; private final int i; WorkerRunnable(CountDownLatch doneSignal, int i) { this.doneSignal = doneSignal; this.i = i; } public void run() { //子线程的任务 try{ doWork(i); }catch (Exception e) { e.printStackTrace(); } //任务执行完毕递减锁存器的计数 doneSignal.countDown(); } void doWork(int i) { System.out.println("这是第"+(i+1)+"个任务"); } }
执行结果:
这是第1个任务这是第3个任务这是第2个任务这是第4个任务这是第5个任务这是第8个任务这是第7个任务这是第9个任务这是第6个任务这是第10个任务所有任务执行完毕
2. newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExecutorsTest { /** * @param args */ public static void main(String[] args) { ////线程数 int num = 10; //CountDownLatch是一个同步辅助类也可以使用AtomicInteger替代 CountDownLatch doneSignal = new CountDownLatch(num); ExecutorService pool = Executors.newFixedThreadPool(num); for(int i=0;i<num;i++) //在未来某个时间执行给定的命令 pool.execute(new WorkerRunnable(doneSignal, i)); try { doneSignal.await(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ //关闭线程池 pool.shutdown(); } //子线程执行完毕,可以开始后续任务处理了 System.out.println("所有任务执行完毕"); }}class WorkerRunnable implements Runnable { private final CountDownLatch doneSignal; private final int i; WorkerRunnable(CountDownLatch doneSignal, int i) { this.doneSignal = doneSignal; this.i = i; } public void run() { //子线程执行任务 try{ doWork(i); } catch (Exception e) { e.printStackTrace(); } //任务执行完毕递减锁存器的计数 doneSignal.countDown(); } void doWork(int i) { System.out.println("这是第"+(i+1)+"个任务"); } }
执行结果:
这是第1个任务这是第5个任务这是第2个任务这是第3个任务这是第4个任务这是第7个任务这是第8个任务这是第6个任务这是第9个任务这是第10个任务所有任务执行完毕
注意事项:
1.异常需要额外处理。
2.使用指定长度线程池,在不使用的时候必须关闭。
0 0
- java线程池的使用及案例分享
- Java线程池及CountDownLatch的使用
- Java线程池源码解析及高质量代码案例
- 线程池创建及使用案例及调试函数assert()断言调试介绍
- 表格的使用及案例
- java线程池使用及设计
- java线程池ThreadPoolExecutor原理及使用
- 线程池的原理及实现&Java四种线程池的使用
- Java线程池原理及四种线程池的使用
- Java里面线程池,及常用四种线程池的使用
- java 什么是线程池及为什么要使用线程池
- Bootstrap学习方法及案例分享
- Bootstrap学习方法及案例分享
- Bootstrap学习方法及案例分享
- java线程和线程池的使用
- java 大数类使用及案例
- [分享]Java 线程池的原理与实现
- [分享]Java 线程池的原理与实现
- Android 换肤原理分析和总结
- webcollector 初探(二)
- CloseHandle
- Protocol Buffer技术详解(语言规范)
- windows task schedule添加tasks
- java线程池的使用及案例分享
- 润乾行式填报与普通填报差异化总结
- Google V8编程详解(二)HelloWorld
- Windows下的SVN备份与还原
- celery清空队列
- AS 常用快捷键
- 对所有节点设置透明度
- NS3命令行学习
- sqlite3命令行常用命令