欢迎光临
我们一直在努力

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解析引擎性能对比谈

赞(0) 打赏
未经允许不得转载:九八云安全 » Java线程池在使用中的问题解疑

评论 抢沙发