`
qindongliang1922
  • 浏览: 2188935 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117671
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126076
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60034
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71403
社区版块
存档分类
最新评论

Java线程池小结

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

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

    package test;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
      for (int i = 0; i < 10; i++) {  
       final int index = i;  
       try {  
        Thread.sleep(index * 1000);  
       } catch (InterruptedException e) {  
        e.printStackTrace();  
       }  
       cachedThreadPool.execute(new Runnable() {  
        public void run() {  
         System.out.println(index);  
        }  
       });  
      }  
     }  
    }  



线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:


    package test;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  
      for (int i = 0; i < 10; i++) {  
       final int index = i;  
       fixedThreadPool.execute(new Runnable() {  
        public void run() {  
         try {  
          System.out.println(index);  
          Thread.sleep(2000);  
         } catch (InterruptedException e) {  
          e.printStackTrace();  
         }  
        }  
       });  
      }  
     }  
    }  


因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()



(3)  newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

    package test;  
    import java.util.concurrent.Executors;  
    import java.util.concurrent.ScheduledExecutorService;  
    import java.util.concurrent.TimeUnit;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  
      scheduledThreadPool.schedule(new Runnable() {  
       public void run() {  
        System.out.println("delay 3 seconds");  
       }  
      }, 3, TimeUnit.SECONDS);  
     }  
    }  


表示延迟3秒执行。

定期执行示例代码如下:

    package test;  
    import java.util.concurrent.Executors;  
    import java.util.concurrent.ScheduledExecutorService;  
    import java.util.concurrent.TimeUnit;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  
      scheduledThreadPool.scheduleAtFixedRate(new Runnable() {  
       public void run() {  
        System.out.println("delay 1 seconds, and excute every 3 seconds");  
       }  
      }, 1, 3, TimeUnit.SECONDS);  
     }  
    }  


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



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

    package test;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    public class ThreadPoolExecutorTest {  
     public static void main(String[] args) {  
      ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  
      for (int i = 0; i < 10; i++) {  
       final int index = i;  
       singleThreadExecutor.execute(new Runnable() {  
        public void run() {  
         try {  
          System.out.println(index);  
          Thread.sleep(2000);  
         } catch (InterruptedException e) {  
          e.printStackTrace();  
         }  
        }  
       });  
      }  
     }  
    }  

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

本篇非原创转载:http://cuisuqiang.iteye.com/blog/2019372
分享到:
评论
1 楼 我是南瓜饼 2015-01-13  
渡劫失败了是吧

相关推荐

    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