Java四种线程池的使用 ゝ一纸荒年。 2022-07-16 08:58 193阅读 0赞 ### 本文转自http://cuisuqiang.iteye.com/blog/2019372 ### ### [Java四种线程池的使用][Java] ### * **博客分类:** * [JDK][] [java][] [线程][Link 1] [线程池][Link 2] [监控][Link 3] Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 **(1) newCachedThreadPool** 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下: Java代码 ![收藏代码][icon_star.png] 1. **package** test; 2. **import** java.util.concurrent.ExecutorService; 3. **import** java.util.concurrent.Executors; 4. **public** **class** ThreadPoolExecutorTest \{ 5. **public** **static** **void** main(String\[\] args) \{ 6. ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); 7. **for** (**int** i = 0; i < 10; i++) \{ 8. **final** **int** index = i; 9. **try** \{ 10. Thread.sleep(index \* 1000); 11. \} **catch** (InterruptedException e) \{ 12. e.printStackTrace(); 13. \} 14. cachedThreadPool.execute(**new** Runnable() \{ 15. **public** **void** run() \{ 16. System.out.println(index); 17. \} 18. \}); 19. \} 20. \} 21. \} 线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。 (2) newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下: Java代码 ![收藏代码][icon_star.png] 1. **package** test; 2. **import** java.util.concurrent.ExecutorService; 3. **import** java.util.concurrent.Executors; 4. **public** **class** ThreadPoolExecutorTest \{ 5. **public** **static** **void** main(String\[\] args) \{ 6. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); 7. **for** (**int** i = 0; i < 10; i++) \{ 8. **final** **int** index = i; 9. fixedThreadPool.execute(**new** Runnable() \{ 10. **public** **void** run() \{ 11. **try** \{ 12. System.out.println(index); 13. Thread.sleep(2000); 14. \} **catch** (InterruptedException e) \{ 15. e.printStackTrace(); 16. \} 17. \} 18. \}); 19. \} 20. \} 21. \} 因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。 定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors() (3) newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下: Java代码 ![收藏代码][icon_star.png] 1. **package** test; 2. **import** java.util.concurrent.Executors; 3. **import** java.util.concurrent.ScheduledExecutorService; 4. **import** java.util.concurrent.TimeUnit; 5. **public** **class** ThreadPoolExecutorTest \{ 6. **public** **static** **void** main(String\[\] args) \{ 7. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 8. scheduledThreadPool.schedule(**new** Runnable() \{ 9. **public** **void** run() \{ 10. System.out.println("delay 3 seconds"); 11. \} 12. \}, 3, TimeUnit.SECONDS); 13. \} 14. \} 表示延迟3秒执行。 定期执行示例代码如下: Java代码 ![收藏代码][icon_star.png] 1. **package** test; 2. **import** java.util.concurrent.Executors; 3. **import** java.util.concurrent.ScheduledExecutorService; 4. **import** java.util.concurrent.TimeUnit; 5. **public** **class** ThreadPoolExecutorTest \{ 6. **public** **static** **void** main(String\[\] args) \{ 7. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 8. scheduledThreadPool.scheduleAtFixedRate(**new** Runnable() \{ 9. **public** **void** run() \{ 10. System.out.println("delay 1 seconds, and excute every 3 seconds"); 11. \} 12. \}, 1, 3, TimeUnit.SECONDS); 13. \} 14. \} 表示延迟1秒后每3秒执行一次。 (4) newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下: Java代码 ![收藏代码][icon_star.png] 1. **package** test; 2. **import** java.util.concurrent.ExecutorService; 3. **import** java.util.concurrent.Executors; 4. **public** **class** ThreadPoolExecutorTest \{ 5. **public** **static** **void** main(String\[\] args) \{ 6. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); 7. **for** (**int** i = 0; i < 10; i++) \{ 8. **final** **int** index = i; 9. singleThreadExecutor.execute(**new** Runnable() \{ 10. **public** **void** run() \{ 11. **try** \{ 12. System.out.println(index); 13. Thread.sleep(2000); 14. \} **catch** (InterruptedException e) \{ 15. e.printStackTrace(); 16. \} 17. \} 18. \}); 19. \} 20. \} 21. \} 结果依次输出,相当于顺序执行各个任务。 你可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察: 工具目录:**C:\\Program Files\\Java\\jdk1.6.0\_06\\bin\\jconsole.exe** 运行程序做稍微修改: Java代码 ![收藏代码][icon_star.png] 1. **package** test; 2. **import** java.util.concurrent.ExecutorService; 3. **import** java.util.concurrent.Executors; 4. **public** **class** ThreadPoolExecutorTest \{ 5. **public** **static** **void** main(String\[\] args) \{ 6. ExecutorService singleThreadExecutor = Executors.newCachedThreadPool(); 7. **for** (**int** i = 0; i < 100; i++) \{ 8. **final** **int** index = i; 9. singleThreadExecutor.execute(**new** Runnable() \{ 10. **public** **void** run() \{ 11. **try** \{ 12. **while**(**true**) \{ 13. System.out.println(index); 14. Thread.sleep(10 \* 1000); 15. \} 16. \} **catch** (InterruptedException e) \{ 17. e.printStackTrace(); 18. \} 19. \} 20. \}); 21. **try** \{ 22. Thread.sleep(500); 23. \} **catch** (InterruptedException e) \{ 24. e.printStackTrace(); 25. \} 26. \} 27. \} 28. \} 效果如下: ![a37b1415-36ac-30b8-baf6-10897bbf443a.jpg][] 选择我们运行的程序: ![c518b086-b144-366c-884c-58a4bf985b05.jpg][] 监控运行状态 [Java]: http://cuisuqiang.iteye.com/blog/2019372 [JDK]: http://cuisuqiang.iteye.com/category/305167 [java]: http://www.iteye.com/blogs/tag/java [Link 1]: http://www.iteye.com/blogs/tag/%E7%BA%BF%E7%A8%8B [Link 2]: http://www.iteye.com/blogs/tag/%E7%BA%BF%E7%A8%8B%E6%B1%A0 [Link 3]: http://www.iteye.com/blogs/tag/%E7%9B%91%E6%8E%A7 [icon_star.png]: /images/20220716/40511065d6624efa82ebe687fcd65952.png [a37b1415-36ac-30b8-baf6-10897bbf443a.jpg]: /images/20220716/cd663eb5db264843af6efc988bb19810.png [c518b086-b144-366c-884c-58a4bf985b05.jpg]: /images/20220716/900cf8adb44c4c03beacdfb51ecd45f5.png
还没有评论,来说两句吧...