Java线程池在使用中的问题解疑

开发 后端
Java线程池如何才能更好的使用呢?这个问题需要大家不断的努力,这完全是需要我们详细的学习相关的技术知识。希望大家有所收获。

Java线程池需要我们不断的学习,其实我们在使用的时候还是有不少问题需要我们解决。我们实现了一个简单的Java线程池。现在我们就可以使用它了,下面的代码做了一个简单的示例:

Java代码

  1. public class SimpleTaskTest extends Task {   
  2. @Override   
  3. public void deal() {   
  4. // do something   
  5. }   
  6. public static void main(String[] args) throws InterruptedException {   
  7. ThreadPoolService service = new ThreadPoolService();   
  8. service.start();   
  9. // 执行十次任务   
  10. for (int i = 0; i < 10; i++) {   
  11. service.runTask(new SimpleTaskTest());   
  12. }   
  13. // 睡眠1秒钟,等待所有任务执行完毕   
  14. Thread.sleep(1000);   
  15. service.stop();   
  16. }   
  17. }   
  18. public class SimpleTaskTest extends Task {  
  19. @Override  
  20. public void deal() {  
  21. // do something  
  22. }  
  23. public static void main(String[] args) throws InterruptedException {  
  24. ThreadPoolService service = new ThreadPoolService();  
  25. service.start();  
  26. // 执行十次任务  
  27. for (int i = 0; i < 10; i++) {  
  28. service.runTask(new SimpleTaskTest());  
  29. }  
  30. // 睡眠1秒钟,等待所有任务执行完毕  
  31. Thread.sleep(1000);  
  32. service.stop();  
  33. }  

 

当然,我们实现的是最简单的,这里只是为了演示Java线程池的实现原理。在实际应用中,根据情况的不同,可以做很多优化。比如:

调整任务队列的规则,给任务设置优先级,级别高的任务优先执行。
动态维护Java线程池,当待执行任务数量较多时,增加线程的数量,加快任务的执行速度;当任务较少时,回收一部分长期闲置的Java线程池,减少对系统资源的消耗。

事实上Java5.0及以上版本已经为我们提供了线程池功能,无需再重新实现。这些类位于java.util.concurrent包中。

Executors类提供了一组创建Java线程池对象的方法,常用的有一下几个:

Java代码

  1. public static ExecutorService newCachedThreadPool() {   
  2. // other code   
  3. }   
  4. public static ExecutorService newFixedThreadPool(int nThreads) {   
  5. // other code   
  6. }   
  7. public static ExecutorService newSingleThreadExecutor() {   
  8. // other code   
  9. }   
  10. public static ExecutorService newCachedThreadPool() {  
  11. // other code  
  12. }  
  13. public static ExecutorService newFixedThreadPool(int nThreads) {  
  14. // other code  
  15. }  
  16. public static ExecutorService newSingleThreadExecutor() {  
  17. // other code  

 

newCachedThreadPool()方法创建一个动态的线程池,其中线程的数量会根据实际需要来创建和回收,适合于执行大量短期任务的情况;newFixedThreadPool(int nThreads)方法创建一个包含固定数量线程对象的Java线程池,nThreads代表要创建的线程数,如果某个线程在运行的过程中因为异常而终止了,那么一个新的线程会被创建和启动来代替它;而newSingleThreadExecutor()方法则只在线程池中创建一个线程,来执行所有的任务。

【编辑推荐】

  1. Java线程池如何体现自己的用途
  2. Java多线程同步如何从JVM的角度体会
  3. Java多线程同步机制的深入探讨
  4. 深入Java虚拟机:JVM中的Stack和Heap
  5. 两种JavaScript解析引擎性能对比谈
责任编辑:张浩 来源: CSDN
相关推荐

2009-12-07 10:05:22

PHP session

2009-12-02 19:14:07

PHP header

2009-12-31 15:28:02

Silverlight

2010-02-05 16:07:52

C++多态覆盖

2009-02-04 18:20:42

服务器虚拟化VMware

2010-01-04 13:15:33

跨域引用Silverl

2009-12-03 15:13:51

PHP开发中问题

2010-02-02 13:20:33

C++对象传递

2021-09-11 15:26:23

Java多线程线程池

2012-02-29 13:26:20

Java

2010-01-04 15:27:45

Silverlight

2009-12-01 15:41:16

PHP substr截

2010-01-20 14:52:21

VB.NET修改数据窗

2009-11-27 10:02:54

PHP mb_strw

2012-05-15 02:18:31

Java线程池

2010-05-24 14:04:48

JavaSwing多线程

2021-12-07 08:31:48

线程池中间件开源

2015-03-24 16:29:55

默认线程池java

2009-12-08 10:33:23

PHP应用问题

2023-02-24 14:46:32

Java线程池编程
点赞
收藏

51CTO技术栈公众号