`
aa8945163
  • 浏览: 276155 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

线程池应用

阅读更多
为什么要建立线程池?



在多线程项目中,如果建立的线程过多,反而可能导致运行速度大大减慢,这是由于线程建立所花费的时间和资源都比较多。
所以我们在多线程中必须很好地来管理线程, 在很好利用多线程能“同步工作”的好处之外,更有效地提高程序运行速度。



线程池是什么?



线程池是指具有固定数量的线程组成的一种组件。这些线程用来循环执行多个应用逻辑。



怎么建立线程池?



线程池主要包括4个部分,它们是:
1. 线程管理


主要是用来建立,启动,销毁工作线程和把工作任务加入工作线程。



2. 工作线程


它是真正的线程类,运行工作任务。



3. 工作队列


它是用来封装线程的容器。


4. 工作任务


它是实现应用逻辑的具体类。



流程图:



线程管理类:

Java代码 
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
* ThreadPoolManager.java
*
*/

/**
* the thread pool manager, is responsible for starting and stopping the work thread.
*
* @author  gray
* @version 1.0
*/
public class ThreadPoolManager {

private static final int DEFAULT_POOL_SIZE = 4;
private List<WorkThread> threadPool;
private Queue<Task> taskQueue;
private int poolSize;

public ThreadPoolManager() {
this(DEFAULT_POOL_SIZE);
}

public ThreadPoolManager(int poolSize) {
if(poolSize <= 0) {
this.poolSize = DEFAULT_POOL_SIZE;
}else {
this.poolSize = poolSize;
}
threadPool = new ArrayList<WorkThread>(this.poolSize);
taskQueue = new ConcurrentLinkedQueue<Task>();
startup();
}

public void startup() {
System.out.println("start work thread...");
synchronized(taskQueue) {
for(int i = 0; i < this.poolSize; i++) {
WorkThread workThread = new WorkThread(taskQueue);
threadPool.add(workThread);
workThread.start();
}
}
}

public void shutdown() {
System.out.println("shutdown work thread...");
synchronized(taskQueue) {
for(int i = 0; i < this.poolSize; i++) {
threadPool.get(i).shutdown();
}

System.out.println("done...");
}
}

public void addTask(Task task) {
synchronized(taskQueue) {
taskQueue.add(task);
taskQueue.notify();
}
}
}

工作线程类:

import java.util.Queue;

/**
* WorkThread.java
*
*/

/**
* the work thread used pull the task of task queue, and execute it.
*
* @author  gray
* @version 1.0
*/
public class WorkThread extends Thread {

private boolean shutdown = false;
private Queue<Task> queue;

public WorkThread(Queue<Task> queue) {
this.queue = queue;
}

public void run() {
while(!shutdown) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread() + " is running...");
synchronized(queue) {
if(!queue.isEmpty()) {
Task task = queue.poll();
task.execute();
}else {
try {
queue.wait(1000);
System.out.println(Thread.currentThread() + " wait...");
}catch(InterruptedException e) {

}
}
}
}
}

public void shutdown() {
shutdown = true;
}
}

工作任务接口:



/**
* Task.java
*
*/

/**
* The task want to execute.
*
* @author  gray
* @version 1.0
*/
public interface Task {

public void execute();
}

工作任务类:


/**
* SimpleTask.java
*
*/

/**
* @author  gray
* @version 1.0
*/
public class SimpleTask implements Task {

/* (non-Javadoc)
* @see Task#execute()
*/
public void execute() {
System.out.println(Thread.currentThread());
}

}

线程池测试类:

/**
* ThreadPoolDemo.java
*
*/

/**
* @author  gray
* @version 1.0
*/
public class ThreadPoolDemo {

public static void main(String[] args) {
ThreadPoolManager threadMg = new ThreadPoolManager();

for(int i = 0; i < 50; i++) {
threadMg.addTask(new SimpleTask());
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
threadMg.shutdown();
}
}

分享到:
评论

相关推荐

    java+socket 及多线程线程池应用(IBM教程)

    在这个“java+socket 及多线程线程池应用”的教程中,我们可以期待学习到以下核心知识点: 1. **Socket基础**:首先会讲解Socket的基本概念,包括服务器端Socket和客户端Socket的工作原理,以及TCP/IP协议在Socket...

    Java分布式应用学习笔记07线程池应用

    ### Java分布式应用学习笔记07线程池应用 在深入探讨Java分布式应用中线程池的应用之前,我们先来理解一下线程池的基本概念及其在并发编程中的重要性。线程池是Java并发编程的核心技术之一,它通过复用一组预创建的...

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

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

    电子科技大学linux环境编程作业——李林——编写一个多队列线程池应用

    编写一个多队列线程池应用 编写一个实现了整数加法运算的线程池 在这个应用中,有三种线程: 一个用户线程。用于向线程池(主控线程)提出加法计算请求 一个主控线程。用于接收用户线程发送的加法计算请求,并负载...

    JAVA线程池应用.pptx

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

    c#线程池应用

    ### C#线程池应用详解 #### 一、引言 在现代软件开发中,多线程编程是一项不可或缺的技术,特别是在高性能和响应性要求较高的应用中。本文将深入探讨Microsoft .NET框架中线程池的概念及其应用。我们将讨论为什么...

    Java线程池应用

    Java线程池应用

    java自定义线程池应用

    ThreadPool 线程池类 DEFAULT_POOL_SIZE 默认线程池大小 threadPool 线程队列 taskQueue 任务队列 poolSize 自定义线程池大小 通过构造启动该线程池,调用addTask 方法将task任务传入,线程池会自动分配线程去执行...

    常用多线程模板与鱼刺类多线程线程池应用小例子

    本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)多线程线程池”的应用,结合具体的代码实例来帮助理解这些概念。 首先,多线程是指在一个程序中同时执行多个不同的线程,以实现并行处理。在...

    线程池应用demo

    线程池介绍,介绍应用中如何使用线程池,开启线程池。

    jdk1.5+线程池应用

    使用jdk1.5 实现的线程池. 可以定制人物和其它特性. 下载后可以自己进行相关功能完善. 欢迎加QQ:934547801一起讨论

    C++实现线程池详解(基于boost源码以及封装等线程池)

    六、线程池应用场景与实践 6.1 服务器应用 6.2 数据处理与计算密集型任务 6.3 图形界面与事件驱动程序 七、C++线程池高级应用与实际案例 7.1 基于负载均衡的任务分配策略 7.2 线程池性能优化技巧 八、实际案例分析与...

    C线程池简单应用层实现

    本文将深入探讨如何在C语言中实现一个简单的线程池应用层,并关注其中的关键技术,如双向循环链表、带参宏、管道通信以及二级指针的使用。 首先,线程池的概念基于预先创建一组线程,它们在需要时执行任务,而不是...

    如何使用线程池

    以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...

    易语言-常用多线程模板与鱼刺类多线程线程池应用小例子

    在这个“易语言-常用多线程模板与鱼刺类多线程线程池应用小例子”中,我们将探讨多线程编程在易语言中的应用,以及如何利用线程池来优化并发执行。 1. **多线程概念**:在计算机程序中,多线程是指一个程序内可以...

    vc 线程池技术源码   

    `ThreadPoolApp`这个文件名可能是指一个包含线程池应用实例的项目或源代码文件。在这个应用中,我们可以预期找到关于如何初始化线程池,如何提交任务到线程池,以及如何管理线程池生命周期的代码。源码分析可能包括...

    qt线程池的小例子

    描述提到它是针对Qt 4.8.6版本编写的,并且可以直接运行,这意味着它包含了一个完整的、可以运行的线程池应用实例。 线程池是一种线程使用模式,它预先创建一定数量的线程,这些线程在空闲时等待新的任务。当有新...

    binder线程池demo

    4. **Binder线程池应用**:在Android的Binder通信中,由于Binder操作是在单独的线程中执行的,如果直接在主线程中处理大量或耗时的Binder请求,可能会阻塞UI线程,导致用户体验下降。因此,使用线程池可以将这些任务...

    android缓存线程池的一个框架

    在描述中提到的"很经典的一个线程池应用"可能指的是一个开源库,如Android的`AsyncTask`或者更先进的`OkHttp`的调度器,它们都提供了线程池管理的实现。这些框架通常会根据任务类型和系统资源智能地调整线程数量,以...

    java.util.concurrent 实现线程池队列

    1. **ArrayBlockingQueue**:基于数组的有界阻塞队列,公平或非公平的锁实现,适合大多数线程池应用场景。 2. **LinkedBlockingQueue**:基于链表结构的无界阻塞队列,吞吐量通常高于ArrayBlockingQueue,但在高并发...

Global site tag (gtag.js) - Google Analytics