`
qiushi_fly
  • 浏览: 4903 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java线程池小结

阅读更多

Java通过Executors提供四种线程池,分别为: 
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 

(1) newCachedThreadPool 
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下: 

Java代码  收藏代码
  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代码  收藏代码
  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代码  收藏代码
  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代码  收藏代码
  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.   }, 13, TimeUnit.SECONDS);    
  13.  }    
  14. }    



表示延迟1秒后每3秒执行一次。 



(4) newSingleThreadExecutor 
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
 

Java代码  收藏代码
  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. }    


结果依次输出,相当于顺序执行各个任务。 

本篇非原创转载:http://cuisuqiang.iteye.com/blog/2019372 

分享到:
评论

相关推荐

    java线程池封装j

    小结 Java线程池封装是Java并发编程中重要的一环,合理的线程池配置和封装能显著提升程序的性能和稳定性。理解线程池的工作原理,根据业务需求选择合适的参数,以及正确处理拒绝策略,都是实现高效并发处理的关键...

    java线程池execute源码-performance:表现

    java线程池execute源码 简介 由于本人工作需要,需要解决一些性能问题,虽然有 Profiler 、Systrace 等工具,但是无法实时监控,多少有些不方便,于是计划写一个能实时监控性能的小工具。经过学习大佬们的文章,最终...

    Android异步加载图像小结 (含线程池,缓存方法).zip

    - **ExecutorService**:Java提供的线程池服务,可以创建FixedThreadPool、SingleThreadExecutor、CachedThreadPool等不同类型的线程池,适用于不同的场景。 3. **缓存策略** - **内存缓存**:使用HashMap或其他...

    Android异步加载图像小结 (含线程池,缓存方法).rar

    在Android应用开发中,图像加载是一个常见的...以上就是关于“Android异步加载图像小结(含线程池,缓存方法)”的主要知识点。在实际应用中,开发者应结合项目需求,合理选择和优化这些技术,以提供流畅的用户体验。

    Java多线程小结

    ### Java多线程小结 #### 一、多线程的概念与意义 多线程是Java编程中的一个重要概念,指的是程序在运行时可以同时执行多个线程的能力。它能够提高程序的性能,尤其是在多核处理器的环境下。多线程使得程序能够更...

    【计算机专业-Andorid项目源码100套之】Android异步加载图像小结 (含线程池,缓存方法)

    本资料包“Android异步加载图像小结(含线程池,缓存方法)”正是针对这一主题进行深入探讨的项目源码集合,适合Android开发者学习和参考。 首先,我们要理解异步加载图像的基本原理。在Android中,通常会使用...

    Android异步加载图像小结 (含线程池,缓存方法).doc.zip

    "Android异步加载图像小结(含线程池,缓存方法)"这个文档详细讲解了如何在Android环境中高效、异步地加载图片,同时利用线程池和缓存策略优化性能。以下是对这些知识点的详细说明: 1. **异步加载**: - 异步...

    Android异步加载图像小结 (含线程池,缓存方法)(实用1).zip

    本篇将详细讲解如何实现Android中的异步图像加载,包括使用线程池和缓存策略。 首先,我们需要理解为什么需要异步加载。在Android中,主线程负责UI更新,如果在主线程中执行耗时操作(如网络请求或解码图片),会...

    Java线程类小结(附思维导图)

    - **Executor框架**:Java 5引入的线程池模型,提高了系统性能和管理线程的便利性。 - **ThreadPoolExecutor**:最常用的线程池实现,参数包括核心线程数、最大线程数、队列大小和拒绝策略。 - **Executors工厂...

    基于Android的Android异步加载图像小结 (含线程池,缓存方法).zip

    2. **Java并发库中的ExecutorService**:Java提供了`ExecutorService`接口,它是线程池的实现。我们可以使用`Executors`类提供的工厂方法来创建线程池,如`newFixedThreadPool`用于创建固定大小的线程池,适合处理...

    Android--开发--异步加载图像小结 (含线程池,缓存方法).rar

    在Android中,我们可以使用`java.util.concurrent`包下的`ExecutorService`接口及其实现类来创建线程池。例如,`ThreadPoolExecutor`允许我们自定义核心线程数、最大线程数、线程存活时间等参数,从而更灵活地管理...

    java线程详解

    八、线程同步小结 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:volatile关键字 Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、延迟连接池 五、...

Global site tag (gtag.js) - Google Analytics