什么是线程
是操作系统能够进行运算调度的最小单位。(例如: cpu 对前端发往后端的一个请求的处理叫一个线程)
什么是线程池
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
线程池的优势
- 降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;
- 提高系统响应速度,当有任务到达时,无需等待新线程的创建便能立即执行;
- 方便线程并发数的管控,线程若是无限制的创建,不仅会额外消耗大量系统资源,更是占用过多资源而阻塞系统或oom等状况,从而降低系统的稳定性。线程池能有效管控线程,统一分配、调优,提供资源使用率;
- 更强大的功能,线程池提供了定时、定期以及可控线程数等功能的线程池,使用方便简单。
线程池流程
线程池实例
1. public class Client { 2. public static void main(String[] args) { 3. //实例化一个固定大小为10个线程的newFixedThreadPool线程池 4. ExecutorService executorService = Executors.newFixedThreadPool(80); 5. List<String> number = new ArrayList<>(); 6. for(int i = 0 ; i <1000;i++){ 7. number.add("多了"+i+"学习"); 8. } 9. final CountDownLatch latch = new CountDownLatch(number.size()); 10. //计算1000个学生的学习数据 11. for(int i = 0;i<number.size();i++){ 12. //线程提交任务 13. executorService.submit(new Study(i,latch,number)); 14. } 15. try{ 16. //使调用该方法的主线程处于等待状态,当倒数到0时主线程才执行 17. latch.await(); 18. } catch (InterruptedException e) { 19. throw new RuntimeException("王思琪学习如何学习多线程处理异常",e); 20. } 21. //关闭线程池 22. executorService.shutdown(); 23. } 24. }
1. public class Study implements Runnable { 2. int studyNumber; 3. CountDownLatch latch; 4. List<String> number; 5. 6. public Study(int studyNumber,CountDownLatch latch,List<String> number){ 7. this.studyNumber=studyNumber; 8. this.latch=latch; 9. this.number=number; 10. } 11. 12. private void start(){ 13. //输出学生编号和执行该任务的线程名称 14. System.out.println("王思琪学了"+studyNumber+"次如何学习"+Thread.currentThread().getName()); 15. } 16. @Override 17. public void run() { 18. //计算学生学习数据的方法 19. this.start(); 20. //计数器容量减一 21. latch.countDown(); 22. } 23. }