`

JAVA线程池简单应用

阅读更多

线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用。因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等。

我们可以把并发执行的任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程。只要池里有空闲的线程,任务就会分配给一个线程执行。在线程池的内部,任务被插入一个阻塞队列(Blocking Queue ),线程池里的线程会去取这个队列里的任务。当一个新任务插入队列时,一个空闲线程就会成功的从队列中取出任务并且执行它。

 

线程池经常应用在多线程服务器上。每个通过网络到达服务器的连接都被包装成一个任务并且传递给线程池。线程池的线程会并发的处理连接上的请求。以后会再深入有关 Java 实现多线程服务器的细节。

Java 5 在 java.util.concurrent 包中自带了内置的线程池,所以你不用非得实现自己的线程池。你可以阅读我写的 java.util.concurrent.ExecutorService 的文章以了解更多有关内置线程池的知识。不过无论如何,知道一点关于线程池实现的知识总是有用的。

这里有一个简单的线程池实现:

01 public class ThreadPool {
02  
03   private BlockingQueue taskQueue = null;
04   private List<PoolThread> threads = new ArrayList<PoolThread>();
05   private boolean isStopped = false;
06  
07   public ThreadPool(int noOfThreads, int maxNoOfTasks) {
08     taskQueue = new BlockingQueue(maxNoOfTasks);
09  
10     for (int i=0; i<noOfThreads; i++) {
11       threads.add(new PoolThread(taskQueue));
12     }
13     for (PoolThread thread : threads) {
14       thread.start();
15     }
16   }
17  
18   public void synchronized execute(Runnable task) {
19     if(this.isStopped) throw
20       new IllegalStateException("ThreadPool is stopped");
21  
22     this.taskQueue.enqueue(task);
23   }
24  
25   public synchronized boolean stop() {
26     this.isStopped = true;
27     for (PoolThread thread : threads) {
28       thread.stop();
29     }
30   }
31  
32 }
01 public class PoolThread extends Thread {
02  
03   private BlockingQueue<Runnable> taskQueue = null;
04   private boolean       isStopped = false;
05  
06   public PoolThread(BlockingQueue<Runnable> queue) {
07     taskQueue = queue;
08   }
09  
10   public void run() {
11     while (!isStopped()) {
12       try {
13         Runnable runnable =taskQueue.take();
14         runnable.run();
15       catch(Exception e) {
16         // 写日志或者报告异常,
17         // 但保持线程池运行.
18       }
19     }
20   }
21  
22   public synchronized void toStop() {
23     isStopped = true;
24     this.interrupt(); // 打断池中线程的 dequeue() 调用.
25   }
26  
27   public synchronized boolean isStopped() {
28     return isStopped;
29   }
30 }

线程池的实现由两部分组成。类 ThreadPool 是线程池的公开接口,而类 PoolThread 用来实现执行任务的子线程。

为了执行一个任务,方法 ThreadPool.execute(Runnable r) 用 Runnable 的实现作为调用参数。在内部,Runnable 对象被放入 阻塞队列 (Blocking Queue),等待着被子线程取出队列。

一个空闲的 PoolThread 线程会把 Runnable 对象从队列中取出并执行。你可以在 PoolThread.run() 方法里看到这些代码。执行完毕后,PoolThread 进入循环并且尝试从队列中再取出一个任务,直到线程终止。

调用 ThreadPool.stop() 方法可以停止 ThreadPool。在内部,调用 stop 先会标记 isStopped 成员变量(为 true)。然后,线程池的每一个子线程都调用 PoolThread.stop() 方法停止运行。注意,如果线程池的 execute() 在 stop() 之后调用,execute() 方法会抛出 IllegalStateException 异常。

子线程会在完成当前执行的任务后停止。注意 PoolThread.stop() 方法中调用了 this.interrupt()。它确保阻塞在taskQueue.dequeue() 里的 wait() 调用的线程能够跳出 wait() 调用(校对注:因为执行了中断interrupt,它能够打断这个调用),并且抛出一个 InterruptedException 异常离开 dequeue() 方法。这个异常在 PoolThread.run() 方法中被截获、报告,然后再检查 isStopped 变量。由于 isStopped 的值是 true, 因此 PoolThread.run() 方法退出,子线程终止。

 

原文转至:http://ifeve.com/thread-pools/

分享到:
评论

相关推荐

    简单JAVA线程池应用---服务器端

    此文档是: 基于简单线程池概念的JAVA服务器端应用 附有连接ORACLE数据库等简单操作. 操作描述:  服务器启动后,会启动10个子线程运行.(配合客户端10个请求进行模拟,控制台输出模拟过程) 服务器主程序进入一个有...

    java线程池概念.txt

    为了防止资源不足,服务器应用程序需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是“池化...

    线程池的实现java

    线程池的实现,简单的实现了线程池的功能,稍微改动就可以应用到项目中了

    Java中的线程与线程池.pptx

    本文档对Java中的线程和线程池进行了简单介绍。首先,阐述了为什么需要线程、Java中实现线程的几种方式,线程的多种状态切换;然后,介绍了为什么需要线程池,JDK自带的线程池实现方式ThreadPoolExecutor的使用及其...

    Java 并发学习笔记:进程和线程,并发理论,并发关键字,Lock 体系,原子操作类,发容器 &amp; 并发工具,线程池,并发实践

    Java具有简单、可移植、高性能和安全性等特点,因此被广泛应用于各种领域。 Java编程语言的语法类似于C++,但是相比C++更简洁和易于理解。它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作...

    Cubic java应用诊断工具-其他

     Cubic java应用诊断工具 更新日志:v1.4.1deature:1、线程池监控2、protobuf协议的支持3、依赖冲突预警4、线程池命令下发bugfix:1、修复页面固定IP导致的数据流发送问题2、修复linux-tools加载问题

    java高手真经 光盘源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    简单的JAVA HTML服务器

    简单的JAVA HTML服务器 实现原理为采用Socket原理、线程池、输入输出流及简单的HTTP协议,麻烦虽小,五脏俱全,只有两个类文件。 使用方法,在DOS窗口下,转到当前HTMLJAR所在目录,打入如下命令: java -Djava.ext....

    Java优化编程(第2版)

    Java优化编程(第2版)通过丰富、完整、富有代表性的实例,展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    简而言之,本书的新版涉及了有关线程的方方面面,从最简单的动画applet到最复杂的应用程序。如果你计划用Java做任何重要的事情,你将发现本书很有价值。 第一章 线程简介 第二章 Java线程API 第三章 同步技术 第四...

    java jdk实列宝典 光盘源代码

    15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容...

    基于短信应用的SP服务平台java源码

    SP可以方便的在此平台开展何管理自己的基于短信的增值服务,系统屏蔽和分离了短信应用中复杂的业务逻辑,为SP提供了开放的易于扩充的功能和简单的二次开发接口。 简介 *软件环境:短信平台包括系统平台和后台管理两...

    百度地图开发java源码-wtp:WTP-一个可靠的线程池管理系统

    是一个轻量级线程池管理系统,能够集中管理不同应用、不同集群的线程配置,修改配置后能够实时刷新,使用起来,简单易用。 支持JAVA客户端,可在Spring/Spring Boot环境下运行 支持JKD1.8,以及更高版本。 演示 : ...

    Java并发编程实战

    1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 性能问题 1.4 线程无处不在 第一部分 基础知识 第2章 线程安全性...

    Java 7并发编程实战手册

    全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完本书,你可以将这些开发技术直接应用到自己的应用程序中。 《Java 7并发编程实战手册》适合具有一定Java编程基础的...

    【并发编程】自定义简单线程池.pdf

    并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 ...

    Java并发编程(学习笔记).xmind

    (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置交互 (3)简化异步事件的处理:服务器应用程序在接受...

    水木清华站∶Java版精华区 含jsp及js等集合.chm

    [目录]Java简单问题 2. [目录]为什么Applet修改后在浏览器中不发生变化 3. [目录]Java中的类型转换 4. [目录]怎样找到编译时缺少的类 2. [目录]Java疑难解答 1. [目录]Java原理问题 ...

Global site tag (gtag.js) - Google Analytics