Java的四種线程池的简单理解

原创 2018年04月16日 21:23:00

参考自:点击打开链接

在正常的工作学习中,我们通常需要执行多种操作,而一个线程一次只能执行一个任务,而这就意味着,我们需要同时使用多个线程,而同时使用多个线程需要占据很大的内存,这显然与我们期望的有所区别,所以,线程池这个概念就随之产生了。那么,什么时线程池呢?

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。简而言之,线程池就是开辟出一块固定的订房用于存放线程,从而减少线程的重复创建,达到节省资源的目的。那么如何创建线程池呢?

在Java中,线程是有Executor这个类来是实现的,Executors类中支持创建四种现线程池,分别为:

1.newCachedThreadPool 创建一个无限大小的线程池,这个线程池是可缓存的线程池,如果线程池的长度超过了护处理的需求,可以灵活的回收线程。如果没有可以回收的线程,就新建一个线程。实例代码如下:

  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 创建出一个定长的线程池,可以控制最大的线程并发数量,超出的线程会在队列中等待。实例代码如下:

  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.newScheduledThreadPool 支持定时及周期性的任务执行,代码示例如下:

  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. }  

4。 newSingleThreadExecutor 创建一个单线程的的线程池,只会用唯一的线程执行任务,所有的任务都按照顺序来执行。实例代码如下:

  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.newCachedThreadPool();  
  7.   for (int i = 0; i < 100; i++) {  
  8.    final int index = i;  
  9.    singleThreadExecutor.execute(new Runnable() {  
  10.     public void run() {  
  11.      try {  
  12.       while(true) {  
  13.        System.out.println(index);  
  14.        Thread.sleep(10 * 1000);  
  15.       }  
  16.      } catch (InterruptedException e) {  
  17.       e.printStackTrace();  
  18.      }  
  19.     }  
  20.    });  
  21.    try {  
  22.     Thread.sleep(500);  
  23.    } catch (InterruptedException e) {  
  24.     e.printStackTrace();  
  25.    }  
  26.   }  
  27.  }  
  28. }  


Java并发编程与技术内幕:线程池深入理解

首先,讲讲什么是线程池?照笔者的简单理解,其实就是一组线程实时处理休眠状态,等待唤醒执行。那么为什么要有线程池这个东西呢?可以从以下几个方面来考虑:其一、减少在创建和销毁线程上所花的时间以及系统资源的...
  • Evankaka
  • Evankaka
  • 2016-06-08 08:38:57
  • 21308

Java线程池理解

线程池原理理解作用: 线程池的作用就是限制系统中执行线程的数量。 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果; 少了浪费系统资源,多了造成系统拥挤效率不高。 用...
  • ymrfzr
  • ymrfzr
  • 2016-05-23 10:34:55
  • 4363

Linux高性能服务器编程:进程池和线程池原理及应用(有图有代码有真相!!!)

一、问题引入 在前面编写多进程、多线程服务器时通过动态创建子进程和子线程来实现并发服务器,这样做有以下缺点: 1)动态创建进程、线程将会比较耗费时间,将导致较慢的客户响应。 2)动态创建的子进程只为一...
  • Sharp_UP
  • Sharp_UP
  • 2017-06-02 18:13:13
  • 210

Java并发编程之线程池的理解与使用

         首先说说线程池的作用:一言以蔽之,就是提高系统效率。如果服务器对每个请求都分别创建一个线程的话,在很短时间内就会产生很多创建和销毁的动作,然而服务器在创建和销毁线程上花费的时间和消耗...
  • sky_100
  • sky_100
  • 2017-04-08 11:01:50
  • 9392

java线程池学习(二) —— 实现一个简单的线程池

在上一篇文章中《java线程池学习(一) —— BlockingQueue》,我们简单探讨了一个BlockingQueue的概念。 那么在这边文章,我们要利用BlockingQueue来自己实现一个简...
  • Great_Smile
  • Great_Smile
  • 2015-10-03 17:01:29
  • 3134

一个简单的java线程池实现

定义线程池的相关接口类/* *线程池接口,只定义了提交任务的方法,其他的相应方法可以自己添加 */ package com.pool; public interface ThreadPool { ...
  • coollye
  • coollye
  • 2015-07-27 00:04:06
  • 460

线程池的简单认识

线程池的基本使用为什么要用线程池 线程生命名周期的开销非常高 资源消耗,活跃的线程数越多,消耗的资源越多,尤其是内存。 线程复用 JDK为我们提供了哪些支持Executor框架 Executor 定义...
  • luwfls
  • luwfls
  • 2017-03-31 20:13:43
  • 158

Java: 动手写一个简单的线程池

package com.younfor.oj;import java.util.ArrayList; import java.util.Collections; import java.util.Li...
  • cq361106306
  • cq361106306
  • 2015-09-10 16:09:47
  • 1735

Java 四种线程池的用法分析

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用,本文是基础篇。转载请标注原地址:http://blog.csdn.net/u011974987/article/de...
  • u011974987
  • u011974987
  • 2016-03-31 16:34:04
  • 11836

java 四种线程池的简介

前瞻四种线程池内部构造都是来自同一个方法: 下面分别介绍一下各个参数的含义: corePoolSize: 线程池中所保存的核心线程数。线程池初始化启动之后,默认是空的,只有当任务来临之时,...
  • u013762572
  • u013762572
  • 2016-08-14 13:58:03
  • 1998
收藏助手
不良信息举报
您举报文章:Java的四種线程池的简单理解
举报原因:
原因补充:

(最多只允许输入30个字)