`
mixer_a
  • 浏览: 367633 次
社区版块
存档分类
最新评论

java5线程并发库的应用

    博客分类:
  • java
阅读更多

 

  1. package com.itm.thread;  
  1. import java.util.concurrent.ExecutorService;  
  2. import java.util.concurrent.Executors;  
  3. import java.util.concurrent.TimeUnit;  
  4.   
  5. /******** 
  6.  *  
  7.  *  每次 只有  三个 任务 被线程 拿去服务了。   
  8.  * @author wang.dm 
  9.  * 
  10.  */  
  11. public class ThreadPoolTest {  
  12.   
  13.     /** 
  14.      * @param args 
  15.      */  
  16.     public static void main(String[] args) {  
  17.         // 创建 3 个 线程池。  
  18.         // 返回值:ExecutorService ThreadPool  
  19.         ExecutorService ThreadPool = Executors.newFixedThreadPool(3);  
  20.           
  21.         for(int i=1;i<=10;i++){ // 循环 10遍  池子里扔进10个任务。  
  22.             final int task = i;  
  23.             ThreadPool.execute(new Runnable(){// 往池子 里面 扔进一个任务。  
  24.                 @Override  
  25.                 public void run() {  
  26.                     for(int j=1;j<=10;j++){ // 每个任务 执行10次。  
  27.                         try {  
  28.                             Thread.sleep(20);  
  29.                         } catch (InterruptedException e) {  
  30.                             e.printStackTrace();  
  31.                         }  
  32.                         System.out.println(Thread.currentThread().getName() + " is looping of " + j + "for task " + task);  
  33.                     }  
  34.                 }  
  35.             });  
  36.         }  
  37.         System.out.println("all of 10 tasks have commited ! ");  
  38. //      ThreadPool.shutdownNow();  
  39.           
  40.         // 定时器:  
  41.         Executors.newScheduledThreadPool(3).schedule(new Runnable(){  
  42.             @Override  
  43.             public void run() {  
  44.                 System.out.println(" boming ");  
  45.             }  
  46.         }, 10, TimeUnit.SECONDS);  
  47.           
  48.         // 定时器:6秒之后炸  每隔2秒  再炸。  
  49.         Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable(){  
  50.             @Override  
  51.             public void run() {  
  52.                 System.out.println(" boming ");  
  53.             }  
  54.         }, 62, TimeUnit.SECONDS);  
  55.     }  
  56.   
  57. }  

 


一、简介 
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: 

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, 
long keepAliveTime, TimeUnit unit, 
BlockingQueue<Runnable> workQueue, 
RejectedExecutionHandler handler) 


corePoolSize: 线程池维护线程的最少数量 
maximumPoolSize:线程池维护线程的最大数量 
keepAliveTime: 线程池维护线程所允许的空闲时间 
unit: 线程池维护线程所允许的空闲时间的单位 
workQueue: 线程池所使用的缓冲队列 
handler: 线程池对拒绝任务的处理策略 

一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。 

当一个任务通过execute(Runnable)方法欲添加到线程池时: 

如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。 

如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。 

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。 

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。 

也就是:处理任务的优先级为: 
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。 

当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。 

unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性: 
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。 

workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue 

handler有四个选择: 
ThreadPoolExecutor.AbortPolicy() 
抛出java.util.concurrent.RejectedExecutionException异常 
ThreadPoolExecutor.CallerRunsPolicy() 
重试添加当前的任务,他会自动重复调用execute()方法 
ThreadPoolExecutor.DiscardOldestPolicy() 
抛弃旧的任务 
ThreadPoolExecutor.DiscardPolicy() 
抛弃当前的任务 


分享到:
评论

相关推荐

    Java多线程与并发库高级应用

    并发库高级应用\多线程\Java

    Java 模拟线程并发

    Java 模拟线程并发是编程领域中的一个重要概念,尤其在多核处理器和高并发应用中,理解并熟练掌握线程并发技术对于提升程序性能至关重要。在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable...

    java 多线程并发实例

    本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    笔记_张孝祥_Java多线程与并发库高级应用

    张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。

    JAVA多线程并发编程

    线程并发的使用可以显著提升程序处理能力,例如在服务器端处理大量用户请求时,如果每个请求都由单独的线程处理,那么处理速度将大大提高。但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决...

    张孝祥Java多线程与并发库高级应用笔记

    Java5线程并发库的应用 - **高级特性**:包括`ExecutorService`、`Future`、`Semaphore`、`CountDownLatch`、`CyclicBarrier`、`Exchanger`等工具,提供了更灵活、强大的线程调度和控制机制。 - **优势**:减少...

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    5. **并发容器**:Java并发库还提供了一些线程安全的集合类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,这些容器可以在高并发场景下安全地使用。 通过以上知识点的学习,开发者可以深入理解Java多线程编程...

    张孝祥Java多线程与并发库高级应用视频教程练习代码

    本教程的焦点在于“张孝祥Java多线程与并发库高级应用视频教程”的实践代码,旨在帮助开发者深入理解并熟练掌握这些关键概念。 首先,我们要明确多线程的概念。在单处理器系统中,多线程允许程序同时执行多个任务,...

    经典Java多线程与并发库高级应用

    在深入探讨Java多线程与并发库的高级应用前,有必要了解一些基础概念。Java线程是Java程序的基础,它代表程序中的一条执行线索或线路。在Java中创建线程有两种传统方式,一种是通过继承Thread类并覆盖其run方法来...

    java线程与并发编程实践

    Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...

    Java入门到精通视频教程.课件.代码,30套Java开发项目代码,Java多线程与并发库高级应用视频教程,及电子书

    黑马+传智 Java入门到精通视频教程+课件+代码,30套Java开发项目代码,Java多线程与并发库高级应用视频教程,及电子书,面试题,开发工具等

    java多线程并发实战和源码

    Java多线程并发实战与源码分析是Java开发中至关重要的一部分,它涉及到程序性能优化、系统资源高效利用以及复杂逻辑的正确同步。本书主要聚焦于Java多线程的基础理论和实际应用,虽然书中实例和源码相对较少,但仍然...

    Java_多线程与并发编程总结.doc

    总之,Java的多线程和并发编程是一个复杂而重要的主题,它涉及到操作系统原理、JVM行为、线程管理、同步机制等多个方面,熟练掌握这些知识对于开发高效、可靠的Java应用程序至关重要。通过理解线程的工作原理和使用...

    JDK5中的多线程并发库.doc

    在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全性。这个库提供了丰富的类和接口,使得开发者能够更好地控制线程的执行、同步和通信。 1. **线程** - **线程与进程的关系**:...

    java多线程和并发.pdf

    总的来说,Java多线程和并发编程是构建高性能、高并发应用程序的基石。掌握其背后的原理和各种并发工具的使用对于解决实际问题具有非常重要的意义。开发者需要深入理解这些概念和技术,才能编写出既快又稳定的Java...

    java多线程查询数据库

    多线程并发查询允许我们将一个大任务分解为多个小任务,每个任务在不同的线程上独立运行,从而提高查询效率。在数据库查询中,这通常适用于处理分页数据或执行并行查询。 ### 2. 线程池 Java中的线程池是通过`java....

    java 多线程高并发相关资料收集

    Java并发库中还包括了并发集合,如ConcurrentHashMap、CopyOnWriteArrayList等,它们提供了线程安全的数据结构,可以在多线程环境下高效地进行读写操作。另外,Future和Callable接口允许异步计算结果,并可以检查...

Global site tag (gtag.js) - Google Analytics