`

并发编程---------初解线程池

 
阅读更多

并发编程系列文章:
      初解线程池:http://ray-yui.iteye.com/blog/2072463
      详解线程池:http://ray-yui.iteye.com/blog/2075311
      并发数据类型:http://ray-yui.iteye.com/blog/2080454
      并发数据结构:http://ray-yui.iteye.com/blog/2084202
      volatile:http://ray-yui.iteye.com/blog/2231474
      判断线程安全:http://ray-yui.iteye.com/blog/2232931


什么是线程池:
      线程池和对象池链接池一样保存着多个线程对象,为了节省系统在多线程并发时不断创建线程和销毁线程所带来的额外开销.线程池的基本功能就是线程的复用


JDK5线程池:
      为了能够更好的控制多线程,JDK5后提供了Executor框架,它是一个现成的线程池实现,帮助开发人员有效的进行线程控制


Executor框架使用:

Java代码 复制代码 收藏代码
  1. public class TestMain {  
  2.   
  3.     @Test  
  4.     public void testExecutor() {  
  5.           
  6.         Executor threadPool = null;  
  7.   
  8.         /* 
  9.          * 该方法返回一个固定线程数量的线程池,该线程池中的线程数量 是固定不变的, 
  10.          * 当一个新任务被提交时,若然没有空闲线程,则会暂时存储在一个任务队列中, 
  11.          * 待有空闲的线程便处理任务队列中的任务 
  12.          */  
  13.         threadPool = Executors.newFixedThreadPool(10);  
  14.   
  15.         /* 
  16.          * 该方法返回一个只有一个线程的线程池,当一个新任务被提交后, 
  17.          * 会进入任务队列待有空闲线程时即处理任务队列中的任务 
  18.          */  
  19.         threadPool = Executors.newSingleThreadExecutor();  
  20.   
  21.         /* 
  22.          * 该方法返回一个可根据实际任务数量调整线程数量的线程池, 
  23.          * 该线程池的线程数量是不固定的,若有空闲线程,则会优先处理任务, 
  24.          * 若所有线程都在执行任务时又有新的任务被提交,则会创建新的线程去处理任务 
  25.          */  
  26.         threadPool = Executors.newCachedThreadPool();  
  27.   
  28.         /* 
  29.          * 每个创建线程池的方法都有ThreadFactory的重载 
  30.          */  
  31.         threadPool = Executors.newFixedThreadPool(10new ThreadFactory() {  
  32.   
  33.             @Override  
  34.             public Thread newThread(Runnable r) {  
  35.                 /* 
  36.                  * 使用ThreadFactory能控制线程产生时的细节操作 
  37.                  */  
  38.                 Thread thread = new Thread(r);  
  39.                 // 设置为守护线程  
  40.                 thread.setDaemon(true);  
  41.                 // 线程优先级为最高  
  42.                 thread.setPriority(Thread.MAX_PRIORITY);  
  43.                 return thread;  
  44.             }  
  45.         });  
  46.   
  47.         // 提交一個任务  
  48.         threadPool.execute(new Runnable() {  
  49.             @Override  
  50.             public void run() {  
  51.                 // executor logic  
  52.             }  
  53.         });  
  54.   
  55.         /* 
  56.          *  但我们一般使用ExecutorService方便我們操作线程池, 
  57.          *  通过ExecutorService我们能使用更多的方式操作线程池 
  58.          */  
  59.   
  60.           
  61.         /* 
  62.          *  其实通过Executors创建的线程池返回的都是ExecutorService对象, 
  63.          *  Executor是ExecutorService的父类 
  64.          */  
  65.         ExecutorService service = (ExecutorService) threadPool;  
  66.   
  67.           
  68.         /* 
  69.          * 提交一个有返回值(计算结果)的任务 温馨提示,若然任务需要返回计算结果, 
  70.          * 使用service.submit(),若然任务不需要 
  71.          * 任何返回结果,使用service.execute(); 
  72.          */  
  73.         Future<Integer> future = service.submit(new Callable<Integer>() {  
  74.   
  75.             @Override  
  76.             public Integer call() throws Exception {  
  77.                 return 10;  
  78.             }  
  79.         });  
  80.   
  81.         /* 
  82.          * 当线程池使用完毕可以使用shutdown关闭线程池,  
  83.          * shutdown是较为温柔的关闭方式,等待任务执行完毕后才关闭线程池 
  84.          * 若然想马上关闭,可以使用service.shutdownNow(); 
  85.          */  
  86.         service.shutdown();  
  87.           
  88.         //更多的API请参考JDK帮助文档  
  89.     }  
  90. }  
public class TestMain {

    @Test
    public void testExecutor() {
        
        Executor threadPool = null;

        /*
         * 该方法返回一个固定线程数量的线程池,该线程池中的线程数量 是固定不变的,
         * 当一个新任务被提交时,若然没有空闲线程,则会暂时存储在一个任务队列中,
         * 待有空闲的线程便处理任务队列中的任务
         */
        threadPool = Executors.newFixedThreadPool(10);

        /*
         * 该方法返回一个只有一个线程的线程池,当一个新任务被提交后,
         * 会进入任务队列待有空闲线程时即处理任务队列中的任务
         */
        threadPool = Executors.newSingleThreadExecutor();

        /*
         * 该方法返回一个可根据实际任务数量调整线程数量的线程池,
         * 该线程池的线程数量是不固定的,若有空闲线程,则会优先处理任务,
         * 若所有线程都在执行任务时又有新的任务被提交,则会创建新的线程去处理任务
         */
        threadPool = Executors.newCachedThreadPool();

        /*
         * 每个创建线程池的方法都有ThreadFactory的重载
         */
        threadPool = Executors.newFixedThreadPool(10, new ThreadFactory() {

            @Override
            public Thread newThread(Runnable r) {
                /*
                 * 使用ThreadFactory能控制线程产生时的细节操作
                 */
                Thread thread = new Thread(r);
                // 设置为守护线程
                thread.setDaemon(true);
                // 线程优先级为最高
                thread.setPriority(Thread.MAX_PRIORITY);
                return thread;
            }
        });

        // 提交一個任务
        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                // executor logic
            }
        });

        /*
         *  但我们一般使用ExecutorService方便我們操作线程池,
         *  通过ExecutorService我们能使用更多的方式操作线程池
         */

        
        /*
         *  其实通过Executors创建的线程池返回的都是ExecutorService对象,
         *  Executor是ExecutorService的父类
         */
        ExecutorService service = (ExecutorService) threadPool;

        
        /*
         * 提交一个有返回值(计算结果)的任务 温馨提示,若然任务需要返回计算结果,
         * 使用service.submit(),若然任务不需要
         * 任何返回结果,使用service.execute();
         */
        Future<Integer> future = service.submit(new Callable<Integer>() {

            @Override
            public Integer call() throws Exception {
                return 10;
            }
        });

        /*
         * 当线程池使用完毕可以使用shutdown关闭线程池, 
         * shutdown是较为温柔的关闭方式,等待任务执行完毕后才关闭线程池
         * 若然想马上关闭,可以使用service.shutdownNow();
         */
        service.shutdown();
        
        //更多的API请参考JDK帮助文档
    }
}



      JDK5后提供了Executor框架方便了开发人员,提供了线程池的实现和简便的API操控线程池,推荐读者在使用多线程时优先使用JDK内置线程池

分享到:
评论

相关推荐

    阿里专家级并发编程架构师课程 彻底解决JAVA并发编程疑难杂症 JAVA并发编程高级教程

    ├─L02-并发编程-线程池-JUC.pdf (3)\并发编程03;目录中文件数:2个 ├─L03-并发编程-并发协同.mp4 ├─L03-并发编程-并发协同.pdf (4)\并发编程04;目录中文件数:2个 ├─04-并发编程-并发协同-2.mp4 ├─L03-...

    深入理解高并发编程-Java线程池核心技术.rar

    深入理解高并发编程-Java线程池核心技术 全面详解Java线程池核心技术

    JAVA并发编程实践-线程池-学习笔记

    Java并发编程实践中的线程池是一个关键的概念,它在多线程编程中扮演着至关重要的角色,有效地管理和调度线程资源,以提高系统的性能和效率。线程池通过复用已存在的线程来减少线程的创建和销毁开销,避免了频繁的上...

    深入理解高并发编程-核心技术原理

    总的来说,这本书全面覆盖了高并发编程中的关键知识点,包括多线程原理、线程池实现、并发控制、分布式系统架构以及面试技巧,适合有志于提升并发编程能力的后端开发者阅读,尤其是对分布式锁和Java并发编程感兴趣的...

    深入理解高并发编程-Java线程池核心技术

    在深入理解高并发编程,尤其是Java线程池核心技术时,我们首先要明白线程与多线程的概念。线程是操作系统中的基本调度单元,它比进程更小,且基本不拥有系统资源,主要由程序计数器、寄存器和栈等组成。在同一个进程...

    java并发编程-从入门到精通

    最后,线程池(ThreadPoolExecutor)是Java并发编程中不可或缺的一部分。通过合理配置线程池,我们可以有效地管理和调度线程,避免资源过度消耗,提高系统性能。 总之,“java并发编程-从入门到精通”这个文档会...

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

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

    Java并发编程--BlockingQueue.docx

    【Java并发编程--BlockingQueue详解】 BlockingQueue 是 Java 并发包(java.util.concurrent)中的一个接口,它扩展了 Queue 接口,并引入了线程安全的特性,特别适合于多线程环境下的数据共享。 BlockingQueue 的...

    阿里专家级并发编程架构师课程-网盘链接提取码下载 .txt

    课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...

    java并发编程-构建块

    在Java编程领域,并发编程是不可或缺的一部分,尤其是在大型系统或高并发应用中。"java并发编程-构建块"这个主题涵盖了使程序能够同时处理多个任务的关键概念和技术。在这个主题下,我们将深入探讨Java中用于构建...

    java并发编程-超级大全整理

    【Java 并发编程-超级大全整理】 Java 并发编程是Java开发中不可或缺的一部分,尤其是在高并发场景下,能够有效提升程序的运行效率。本文将深入探讨Java多线程的相关知识点,帮助开发者理解并掌握如何在Java环境中...

    并发-线程池和阻塞队列

    在Java编程中,"并发-线程池和...总之,理解和掌握线程池与阻塞队列的原理和使用方法,是提升Java并发编程能力的重要一步。它们为开发人员提供了一种强大而灵活的工具,能够在处理并发问题时保证系统的稳定性和性能。

    java并发编程-AQS和JUC实战

    ### Java并发编程-AQS和JUC实战 #### 一、ReentrantLock 重入锁 **1.1 概述** - **基本介绍**: `ReentrantLock` 是一个实现了 `Lock` 接口的可重入互斥锁,提供比 `synchronized` 更丰富的功能。与 `synchronized...

    Socket网络编程学习笔记之---使用线程池提高性能

    通过以上实践,我们可以更好地理解如何在Socket网络编程中利用线程池优化性能,这对于开发高并发的网络服务具有重要的指导意义。在实际项目中,结合具体的业务需求调整线程池参数,可以进一步提升系统的稳定性和效率...

    23 高并发编程和线程池

    23 高并发编程和线程池,教程视频:java中高并发编程和线程池

    并发-线程池和阻塞队列.pdf

    综上所述,线程池和阻塞队列是并发编程中的核心概念。它们的合理使用能够显著提升程序性能,降低资源消耗,并简化并发程序的开发复杂度。但在使用时,必须根据具体的业务场景和性能需求,仔细设计线程池的大小、线程...

    JAVA并发编程实践-中文-高清-带书签-完整版

    《JAVA并发编程实践》是Java开发人员深入理解并发编程的一本经典著作,由Doug Lea撰写,本书中文版高清完整,包含丰富的书签,便于读者查阅和学习。这本书旨在帮助开发者掌握在Java平台上进行高效、安全并发编程的...

    线程-线程池-锁-集合-Map-队列.docx

    综上所述,线程、线程池、集合和队列是Java并发编程的核心概念,理解和掌握它们对于开发高效、稳定的并发应用程序至关重要。在实际开发中,应根据具体需求选择合适的线程管理策略、数据结构和同步机制,以实现高性能...

    Java 多线程与并发(17-26)-JUC线程池- FutureTask详解.pdf

    `FutureTask`是Java并发编程中一个非常重要的工具,它不仅可以用于封装任务并异步执行,还能方便地获取任务执行结果以及管理任务的状态。理解`FutureTask`的工作原理及其使用方法,对于提高程序的并发性能和响应能力...

    Java并发编程实践-电子书1-9章pdf

    《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...

Global site tag (gtag.js) - Google Analytics