`

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线程池。虽然这个实现非常基础,但它涵盖了线程池的主要设计思想和技术要点。对于更复杂的应用场景,建议使用成熟的线程池框架,如`ThreadPoolExecutor`,它...

    Java线程池文档

    Java线程池是一种高效管理线程的机制,它允许开发者预先设定线程的数量,并通过池化的方式重用已创建的线程,以提高系统性能,减少线程的创建和销毁开销。线程池在Java中是通过`java.util.concurrent`包下的`...

    JAVA线程池的原理与实现.pdf

    Java线程池是一种高效利用系统资源、管理并发执行任务的机制。...总的来说,理解Java线程池的工作原理和实现对于优化并发应用程序至关重要,它可以帮助我们更好地控制系统的并发度,提高系统的响应速度和资源利用率。

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

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

    JAVA线程池应用.pptx

    ### JAVA线程池应用知识点详解 #### 一、Java线程池概述 线程池是Java多线程编程中的一个重要概念。它通过管理一组多线程的方式,为应用程序提供了一种更加灵活高效的线程管理机制。相比于直接创建线程,使用线程池...

    Java线程池.pdf

    ### Java线程池详解 #### 引言 在现代计算机科学中,线程作为轻量级的进程,已经成为操作系统和应用程序提高并发性、优化资源...理解和掌握Java线程池的原理和使用方法,对于开发高性能、高可靠的Java应用至关重要。

    在spring boot中使用java线程池ExecutorService的讲解

    Spring Boot 作为一个流行的 Java 框架,提供了许多便捷的功能来帮助开发者快速构建应用程序。其中之一就是使用 Java 线程池 ExecutorService 来管理线程池。今天,我们将深入探讨在 Spring Boot 中使用 Java 线程池...

    java线程池threadpool简单使用源码

    要理解`java线程池threadpool简单使用源码`,你需要查看`src`目录下的Java文件,了解如何实例化`ThreadPoolExecutor`,设置相关参数,以及如何提交任务到线程池。同时,查看源码中对`ThreadGroup`的使用,理解它如何...

    java线程池的使用方式

    ### Java线程池的使用方式 #### 一、简介 ...通过以上介绍和示例,我们可以看到Java线程池的强大功能及其在实际应用中的重要作用。理解并掌握这些概念将有助于开发者更好地管理和优化多线程应用程序。

    Java 线程池_动力节点Java学院整理

    Java线程池是一种高效管理线程资源的工具,它的出现是为了优化系统性能,尤其是在需要频繁创建和销毁线程的情况下。由于操作系统创建新线程需要进行内存分配、上下文切换等操作,这涉及到一定的开销。因此,使用...

    tcp_thread_java.zip_Java 线程池_java TCP线程

    Java线程池是一种高效管理线程资源的工具,它能够帮助开发者有效地控制并发执行的线程数量,提高系统性能,并确保程序...通过学习和理解这些代码,开发者可以更好地理解和应用Java线程池技术,优化自己的TCP服务程序。

    java线程池概念.txt

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

    基于Java线程池技术实现Knock Knock游戏项目.zip

    基于Java线程池技术实现的Knock Knock游戏项目是一个专为Java开发者设计的实战资源包。它通过实际项目,帮助开发者深入理解并掌握Java语言及线程池技术的应用。该资源包含服务端和客户端两部分,实现了一个简单的...

    线程池java

    ### 深入理解Java之线程池 #### 一、Java中的`ThreadPoolExecutor`类 在Java中,`ThreadPoolExecutor`是线程池的核心实现类之一,它提供了丰富的配置选项来...通过以上介绍,相信您对Java线程池有了更深入的理解。

    java线程池

    ### Java线程池的核心概念与实现 #### 一、引言 Java线程池是一种用于管理线程的机制,能够有效提升程序的并发性能。它通过重用预先创建的线程来减少创建新线程所需的开销,同时也能有效地控制运行中的线程数量。...

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    _JAVA线程池介绍以及简单实例.doc

    Java线程池是一种高效利用系统资源的机制,它允许开发者预先配置一定数量的线程,以便在处理任务时能够快速响应。线程池的核心概念在于避免频繁地创建和销毁线程,这可以显著减少系统开销,提升整体性能。本文将深入...

    java线程池_2.pdf

    Java线程池是一种管理线程资源的技术,它通过限制系统中执行线程的数量来优化程序性能,避免因频繁创建和销毁线程导致的系统开销。线程池的核心原理是维护一个工作线程集合和一个任务队列。当任务到来时,如果线程池...

    Java-Thread-Pool-example:一个简单的 Java 线程池示例

    Java线程池是一种高效管理并发任务的机制,它在多线程编程中扮演着至关重要的角色。线程池通过预先创建并维护一组可重用线程来提高性能和响应速度,避免频繁创建和销毁线程所带来的开销。在这个"Java-Thread-Pool-...

    创建Java程序中线程池的详解

    一个简单的线程池至少包含以下四个关键组成部分: 1. **线程池管理器(ThreadPool Manager)**:负责线程池的创建、销毁以及管理工作。它维护着线程池的状态,控制线程的生命周期,并根据需要调整线程池的大小。 2...

Global site tag (gtag.js) - Google Analytics