Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。

有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程。目前有关这方面的资料和书籍都少之又少,大部分介绍线程方面书籍还停留在java5之前的知识层面上。

在Java5之前,要实现一个线程池是相当有难度的,现在Java5为我们做好了一切,我们只需要按照提供的API来使用,即可享受线程池带来的极大便利。

线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

Java5提供5种类型的线程池,分别如下:

一:newCachedThreadPool-可变尺寸的线程池(缓存线程池) 
(1)缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse(重用),如果没有,就建立一个新的线程加入池中; 
(2)缓存型池子,通常用于执行一些生存周期很短的异步型任务;因此一些面向连接的daemon型server中用得不多; 
(3)能reuse(重用)的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池; 
(4)注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。

二:newFixedThreadPool-固定大小的线程池 
(1)newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程; 
(2)其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子; 
(3)和cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP IDLE机制之类的),所以FixedThreadPool多数针对一些很稳定很固定的正规并发线程,多用于服务器; 
(4)从方法的源代码看,cache池和fixed池调用的是同一个底层池,只不过参数不同:
fixed池线程数固定,并且是0秒IDLE(无IDLE);
cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE。

三:ScheduledThreadPool-调度线程池 
(1)调度型线程池; 
(2)这个池子里的线程可以按schedule依次delay执行,或周期执行。

四:SingleThreadExecutor-单例线程池 
(1)单例线程,任意时间池中只能有一个线程; 
(2)用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE(无IDLE)。

package cn.thread;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** 线程池用法* * @author 林计钦* @version 1.0 2013-7-25 上午10:00:46*/
public class ThreadPoolTest {public static void main(String[] args) {ThreadPoolTest test=new ThreadPoolTest();//创建一个可重用固定线程数的线程池 ExecutorService pool = Executors.newFixedThreadPool(2); //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口 Thread t1 = test.new MyThread(); Thread t2 = test.new MyThread(); Thread t3 = test.new MyThread(); Thread t4 = test.new MyThread(); Thread t5 = test.new MyThread(); //将线程放入池中进行执行 pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); //关闭线程池 pool.shutdown(); }class MyThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在执行。");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}

五、自定义线程池
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
参数:
corePoolSize 
核心线程数,核心线程会一直存活,即使没有任务需要处理。当线程数小于核心线程数时,即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交给现有的线程处理。
核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出。

maximumPoolSize
当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常。

keepAliveTime 
当线程空闲时间达到keepAliveTime,该线程会退出,直到线程数量等于corePoolSize。如果allowCoreThreadTimeout设置为true,则所有线程均会退出直到线程数量为0。

unit 
keepAliveTime 参数的时间单位。

workQueue 
执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。

抛出:
IllegalArgumentException - 如果corePoolSize或keepAliveTime小于零,或者maximumPoolSize小于或等于零,或者corePoolSize 大于maximumPoolSize。
NullPointerException - 如果workQueue为null

eg、
//创建等待队列 
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(20); 
//创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。 
ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 3, 2, TimeUnit.MILLISECONDS, queue); 
//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口 
Thread t1 = new MyThread(); 
Thread t2 = new MyThread(); 
//将线程放入池中进行执行 
pool.execute(t1); 
pool.execute(t2); 
//关闭线程池 
pool.shutdown();

package cn.thread;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 自定义连接池* * @author 林计钦* @version 1.0 2013-7-25 上午10:09:17*/
public class ThreadPoolExecutorTest {public static void main(String[] args) {ThreadPoolTest test = new ThreadPoolTest();// 创建等待队列BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20);// 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 3, 2, TimeUnit.MILLISECONDS, bqueue);// 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口Thread t1 = test.new MyThread();Thread t2 = test.new MyThread();Thread t3 = test.new MyThread();Thread t4 = test.new MyThread();Thread t5 = test.new MyThread();Thread t6 = test.new MyThread();Thread t7 = test.new MyThread();// 将线程放入池中进行执行pool.execute(t1);pool.execute(t2);pool.execute(t3);pool.execute(t4);pool.execute(t5);pool.execute(t6);pool.execute(t7);// 关闭线程池pool.shutdown();}class MyThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在执行。");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}

转载于:https://www.cnblogs.com/dreamOfChen/p/4896385.html

Java多线程-新特性-线程池相关推荐

  1. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  2. Java多线程设计模式(4)线程池模式

    前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将"委托消息的一端"和"执行消息的一端&qu ...

  3. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  4. 掌握JAVA多线程的利器-线程池

    为什么80%的码农都做不了架构师?>>>    相信大多数接触过多线程的朋友都会有这样的困惑,明明使用了多线程,为何还是一团糟?用下面两幅图再合适不过了: 理想情况下的多线程VS 现 ...

  5. java多线程新特性

    Java的线程池分好多种:固定尺寸的线程池.单任务线程池. 可变尺寸连接池.延迟连接池.单任务延迟连接池.自定义线程池 固定大小的线程池 方法 说明 ExecutorService pool =Exe ...

  6. java多线程并发及线程池

    线程的常用创建方式 1.继承Thread类创建线程类 public class FirstThreadTest extends Thread {public void run(){System.out ...

  7. java多线程编程之线程池技术全面解读

    在多线程编程时,创建线程是十分消耗资源的,当线程创建过多时,便会引发内存溢出,因此引入了线程池技术. 目录 线程池的优势 线程池的创建&使用 线程池的工作原理 线程池的参数 功能线程池 线程池 ...

  8. Java多线程系列 JUC线程池01 线程池框架

    转载  http://www.cnblogs.com/skywang12345/p/3509903.html 为什么引入Executor线程池框架 new Thread()的缺点 1. 每次new T ...

  9. Java多线程案例之线程池

    文章目录 一. 线程池概述 1. 什么是线程池 2. Java标准库提供的线程池 二. 线程池的简单实现 一. 线程池概述 1. 什么是线程池 线程池和和字符串常量池, 数据库连接池一样, 都是为了提 ...

最新文章

  1. 彩色图像分割方法的汇总
  2. 线性代数:第三章 矩阵的初等变换与线性方程组(1)矩阵的初等变换 矩阵的秩
  3. UIAlertView' is deprecated: first deprecated in iOS 9.0 - UIAlertView is deprecated. Use UIAlert
  4. 有艺术细胞,就一定能做个好的游戏美术吗?
  5. 调度策略的测试方法及其自动化
  6. mysql学习笔记之mysqlparameter(摘)
  7. 明天一定要记得放一个硬币在口袋
  8. sklearn中的支持向量机SVC
  9. web安全测试-AppScan使用分享
  10. Leanote使用mysql_《搭建个人Leanote云笔记本》阿里云体验实验室 教程
  11. 代理对象之spring注解事务控制或shiro注解权限控制的理解
  12. MySQL之视图、触发器、事务、存储过程、函数
  13. POJ 3666 Making the Grade (DP滚动数组)
  14. 利用Hownet进行语义相似度计算的类(
  15. wps制作可以打钩或取消打钩的正方框
  16. 网狐精华版后台修改记录
  17. 网络基础笔记(三)二层交换机工作原理、单点故障与链路聚合、DHCP
  18. 麒麟V10SP1的国产化Qt适配
  19. 还原SQL Server数据库
  20. ABAP CDS VIEW WITH ASSOCIATION示例

热门文章

  1. Spring Cloud 第一天课堂笔记
  2. Asp.Net就业课之案例实践第二次课
  3. myeclipse maven 报错javax.servlet.http.HttpServlet的解决方法
  4. linux 安装 mysql 5.6_Linux安装MySQL_5.6
  5. efcore根据多个条件更新_EFCore.Sharding(EFCore开源分表框架)
  6. {'张三丰': 101, '无忌': 102, '赵敏': 102} (Python)
  7. Akka并发编程——第八节:Actor模型(七)
  8. acrgis api for javaScript中的FeatureLayer查询
  9. 阿里妈妈搜索广告CTR模型的“瘦身”之路
  10. 缓存穿透、缓存击穿和缓存雪崩