`
wb284551926
  • 浏览: 551510 次
文章分类
社区版块
存档分类
最新评论

Java线程(六):线程池(转载)

 
阅读更多

        自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。

        我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那么服务器需要并发的处理多个请求,就需要线程池技术,下面来看一下Java并发包下如何创建线程池。

        1.  创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程。

 

[java] view plaincopy
 
  1. ExecutorService threadPool = Executors.newFixedThreadPool(3);// 创建可以容纳3个线程的线程池  
        2. 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。

 

 

[java] view plaincopy
 
  1. ExecutorService threadPool = Executors.newCachedThreadPool();// 线程池的大小会根据执行的任务数动态分配  
        3. 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。

 

 

[java] view plaincopy
 
  1. ExecutorService threadPool = Executors.newSingleThreadExecutor();// 创建单个线程的线程池,如果当前线程在执行任务时突然中断,则会创建一个新的线程替代它继续执行任务  
        4. 创建一个可安排在给定延迟后运行命令或者定期地执行的线程池。

 

 

[java] view plaincopy
 
  1. ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);// 效果类似于Timer定时器  
        每种线程池都有不同的使用场景,下面看一下这四种线程池使用起来有什么不同。

 

        1. FixedThreadPool

 

[java] view plaincopy
 
  1. import java.util.concurrent.ExecutorService;  
  2. import java.util.concurrent.Executors;  
  3. public class ThreadPoolTest {  
  4.     public static void main(String[] args) {  
  5.         ExecutorService threadPool = Executors.newFixedThreadPool(3);  
  6.         for(int i = 1; i < 5; i++) {  
  7.             final int taskID = i;  
  8.             threadPool.execute(new Runnable() {  
  9.                 public void run() {  
  10.                     for(int i = 1; i < 5; i++) {  
  11.                         try {  
  12.                             Thread.sleep(20);// 为了测试出效果,让每次任务执行都需要一定时间  
  13.                         } catch (InterruptedException e) {  
  14.                             e.printStackTrace();  
  15.                         }  
  16.                         System.out.println("第" + taskID + "次任务的第" + i + "次执行");  
  17.                     }  
  18.                 }  
  19.             });  
  20.         }  
  21.         threadPool.shutdown();// 任务执行完毕,关闭线程池  
  22.     }  
  23. }  
        输出结果:

 

 

[java] view plaincopy
 
  1. 1次任务的第1次执行  
  2. 2次任务的第1次执行  
  3. 3次任务的第1次执行  
  4. 2次任务的第2次执行  
  5. 3次任务的第2次执行  
  6. 1次任务的第2次执行  
  7. 3次任务的第3次执行  
  8. 1次任务的第3次执行  
  9. 2次任务的第3次执行  
  10. 3次任务的第4次执行  
  11. 2次任务的第4次执行  
  12. 1次任务的第4次执行  
  13. 4次任务的第1次执行  
  14. 4次任务的第2次执行  
  15. 4次任务的第3次执行  
  16. 4次任务的第4次执行  
        上段代码中,创建了一个固定大小的线程池,容量为3,然后循环执行了4个任务,由输出结果可以看到,前3个任务首先执行完,然后空闲下来的线程去执行第4 个任务,在FixedThreadPool中,有一个固定大小的池,如果当前需要执行的任务超过了池大小,那么多于的任务等待状态,直到有空闲下来的线程 执行任务,而当执行的任务小于池大小,空闲的线程也不会去销毁。
        2. CachedThreadPool

 

        上段代码其它地方不变,将newFixedThreadPool方法换成newCachedThreadPool方法。

        输出结果:

 

[java] view plaincopy
 
  1. 3次任务的第1次执行  
  2. 4次任务的第1次执行  
  3. 1次任务的第1次执行  
  4. 2次任务的第1次执行  
  5. 4次任务的第2次执行  
  6. 3次任务的第2次执行  
  7. 2次任务的第2次执行  
  8. 1次任务的第2次执行  
  9. 2次任务的第3次执行  
  10. 3次任务的第3次执行  
  11. 1次任务的第3次执行  
  12. 4次任务的第3次执行  
  13. 2次任务的第4次执行  
  14. 4次任务的第4次执行  
  15. 3次任务的第4次执行  
  16. 1次任务的第4次执行  
        可见,4个任务是交替执行的,CachedThreadPool会创建一个缓存区,将初始化的线程缓存起来,如果线程有可用的,就使用之前创建好的线程,如果没有可用的,就新创建线程,终止并且从缓存中移除已有60秒未被使用的线程。

 

        3. SingleThreadExecutor        

       上段代码其它地方不变,将newFixedThreadPool方法换成newSingleThreadExecutor方法。       

       输出结果:

 

[java] view plaincopy
 
  1. 1次任务的第1次执行  
  2. 1次任务的第2次执行  
  3. 1次任务的第3次执行  
  4. 1次任务的第4次执行  
  5. 2次任务的第1次执行  
  6. 2次任务的第2次执行  
  7. 2次任务的第3次执行  
  8. 2次任务的第4次执行  
  9. 3次任务的第1次执行  
  10. 3次任务的第2次执行  
  11. 3次任务的第3次执行  
  12. 3次任务的第4次执行  
  13. 4次任务的第1次执行  
  14. 4次任务的第2次执行  
  15. 4次任务的第3次执行  
  16. 4次任务的第4次执行  
        4个任务是顺序执行的,SingleThreadExecutor得到的是一个单个的线程,这个线程会保证你的任务执行完成,如果当前线程意外终止,会创建一个新线程继续执行任务,这和我们直接创建线程不同,也和newFixedThreadPool(1)不同。

 

    4.ScheduledThreadPool    

 

[java] view plaincopy
 
  1. import java.util.concurrent.ScheduledExecutorService;  
  2. import java.util.concurrent.TimeUnit;  
  3. public class ThreadPoolTest {  
  4.     public static void main(String[] args) {  
  5.         ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(1);  
  6.         // 5秒后执行任务  
  7.         schedulePool.schedule(new Runnable() {  
  8.             public void run() {  
  9.                 System.out.println("爆炸");  
  10.             }  
  11.         }, 5, TimeUnit.SECONDS);  
  12.         // 5秒后执行任务,以后每2秒执行一次  
  13.         schedulePool.scheduleAtFixedRate(new Runnable() {  
  14.             @Override  
  15.             public void run() {  
  16.                 System.out.println("爆炸");  
  17.             }  
  18.         }, 52, TimeUnit.SECONDS);  
  19.     }  
  20. }  
        ScheduledThreadPool是一个固定大小的线程池,与FixedThreadPool类似,执行的任务是定时执行。

        Java的并发包很强大,上面所说只是入门,随着学习深入,会有更多记录在博客里。

        本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7443324,转载请注明。

分享到:
评论

相关推荐

    Java多线程+线程池.docx

    Java 多线程和线程池 Java 多线程是指在 Java 编程语言中,一个线程的动态执行过程。这个过程包括线程的创建、执行和销毁三个阶段。在 Java 中,创建线程有多种方式,包括通过实现 Runnable 接口、继承 Thread 类...

    Java并发编程:线程池的使用 - 平凡希 - 博客园1

    Java并发编程中的线程池是提高系统效率的关键工具,它解决了频繁创建和销毁线程的问题。线程池通过复用已存在的线程来处理任务,从而避免了每次任务执行完毕后销毁线程的开销。在Java中,线程池的核心实现是`java....

    Java多线程编程总结

    Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-...

    线程池详解:线程池七大核心参数、线程池工作原理、线程池的创建方式、线程池的拒绝策略、如何合理分配线程池大小

    线程池是Java多线程编程中的重要概念,它是一种管理线程的机制,通过池化技术有效地管理和控制线程的生命周期,以提高系统资源的利用率和系统性能。本篇文章将深入探讨线程池的七大核心参数、工作原理、创建方式、...

    JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    .......................................JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺JAVA线程、线程池资料----下载不...

    Java中多线程的使用线程池.docx

    Java中的线程池是多线程编程中一种高效、可管理的执行机制。它通过预先创建并维护一组线程,避免了频繁地创建和销毁线程带来的开销,从而提高了程序的性能和响应速度。线程池的核心概念包括以下几个方面: 1. **...

    java线程详解

    Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、延迟连接池 五、单任务延迟连接池 六、自定义线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上...

    Java理论与实践:线程池与工作队列

    线程池远不是服务器应用程序内使用多线程的唯一方法。如同上面所提到的,有时,为每个新任务生成一个新线程是十分明智的。然而,如果任务创建过于频繁而任务的平均处理时间过短,那么为每个任务生成一个新线程将会...

    C语言多线程编程之线程池

    线程池是一种优化的线程管理技术,它提高了系统资源的利用率,并降低了线程的创建和销毁开销。本文将深入探讨C语言中的线程池及其相关知识点。 首先,线程是操作系统分配CPU时间的基本单元,一个进程可以包含多个...

    java服务器端Socket线程池

    综上所述,Java服务器端的Socket线程池是实现高效并发处理的关键技术,通过合理的线程管理和资源调度,能够显著提升服务器的处理能力,并保证服务的稳定性和可靠性。在实际开发中,应结合具体需求选择合适的线程池...

    C#Winform异步多线程和线程池集成的用法

    在C#编程中,线程和线程池是并发编程中的关键概念,特别是在开发Windows桌面应用程序(Winform)时,为了提升程序的响应性和效率,理解并熟练运用这些技术至关重要。本文将深入探讨如何在Winform应用中使用异步多...

    java多种类型的线程池操作

    Java中的线程池是并发编程中的重要概念,它在多线程环境中扮演着资源管理和优化的角色。线程池通过预创建一定数量的线程来管理线程生命周期,从而避免频繁地创建和销毁线程带来的开销。理解并熟练运用线程池能够显著...

    Python 程序语言设计模式思路-并发模式:线程池模式:管理线程池,优化线程创建和销毁

    线程池模式(Thread Pool Pattern)是一种优化线程管理的设计模式,它通过创建一个线程池来管理和复用线程,从而避免频繁的线程创建和销毁,提高系统性能。线程池模式适用于需要频繁执行大量短生命周期任务的场景,...

    Java 线程池的原理与实现

    - **Java内置线程池**:Java通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类如`ThreadPoolExecutor`提供了线程池的实现。`ThreadPoolExecutor`允许自定义线程池的核心参数,如核心线程数、最大...

    Java 线程池详解,图文并茂.pdf

    Java 线程池是一种高效的线程管理机制,它可以避免频繁创建和销毁线程,从而提高系统性能。线程池的设计思想源于生活,例如工厂的生产流程可以看作是一个线程池。 在 Java 中,线程池的实现类是 ThreadPoolExecutor...

    18.【线程池、Lambda表达式】_java线程_lambda线程池_meantbs3_

    此外,Java 5及以上版本还提供了`Executors`工厂类,方便快速创建不同类型的线程池,如固定大小线程池、单线程池和缓存线程池等。 接着,我们讨论Lambda表达式。Lambda表达式是Java 8引入的一个重要特性,它是一种...

    Java中的线程与线程池.pptx

    Java中的线程与线程池是程序设计中的关键概念,特别是在多任务并行处理和优化系统性能时。本文档深入探讨了这两个主题,旨在帮助开发者更好地理解和应用它们。 线程是为了充分利用CPU资源而引入的执行单元。在多...

    java线程、线程池、xml解析入门

    Java线程、线程池和XML解析是Java编程中至关重要的三个概念,它们在实际开发中扮演着不可或缺的角色。下面将分别对这三个主题进行深入的介绍。 首先,我们来看Java线程。线程是程序执行的最小单位,一个进程可以...

    java_thread_cn.rar_Java 线程池_java thread books_java线程_线程池_线程池调度

    Java线程池是Java并发编程中的重要组成部分,它在多线程编程中扮演着至关重要的角色,有效地管理和调度了大量的并发任务。线程池通过预先创建并维护一组可重用线程,来提升程序的性能和效率,避免了频繁地创建和销毁...

    java线程池使用后到底要关闭吗

    java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠性。然而,在使用java线程池时,一个常见的问题是:使用完线程池后到底要不要关闭?本文将通过实例代码和详细解释,...

Global site tag (gtag.js) - Google Analytics