为什么要建立线程池?
在多线程项目中,如果建立的线程过多,反而可能导致运行速度大大减慢,这是由于线程建立所花费的时间和资源都比较多。
所以我们在多线程中必须很好地来管理线程, 在很好利用多线程能“同步工作”的好处之外,更有效地提高程序运行速度。
线程池是什么?
线程池是指具有固定数量的线程组成的一种组件。这些线程用来循环执行多个应用逻辑。
怎么建立线程池?
线程池主要包括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 及多线程线程池应用”的教程中,我们可以期待学习到以下核心知识点: 1. **Socket基础**:首先会讲解Socket的基本概念,包括服务器端Socket和客户端Socket的工作原理,以及TCP/IP协议在Socket...
### Java分布式应用学习笔记07线程池应用 在深入探讨Java分布式应用中线程池的应用之前,我们先来理解一下线程池的基本概念及其在并发编程中的重要性。线程池是Java并发编程的核心技术之一,它通过复用一组预创建的...
此文档是: 基于简单线程池概念的JAVA服务器端应用 附有连接ORACLE数据库等简单操作. 操作描述: 服务器启动后,会启动10个子线程运行.(配合客户端10个请求进行模拟,控制台输出模拟过程) 服务器主程序进入一个有...
编写一个多队列线程池应用 编写一个实现了整数加法运算的线程池 在这个应用中,有三种线程: 一个用户线程。用于向线程池(主控线程)提出加法计算请求 一个主控线程。用于接收用户线程发送的加法计算请求,并负载...
### JAVA线程池应用知识点详解 #### 一、Java线程池概述 线程池是Java多线程编程中的一个重要概念。它通过管理一组多线程的方式,为应用程序提供了一种更加灵活高效的线程管理机制。相比于直接创建线程,使用线程池...
### C#线程池应用详解 #### 一、引言 在现代软件开发中,多线程编程是一项不可或缺的技术,特别是在高性能和响应性要求较高的应用中。本文将深入探讨Microsoft .NET框架中线程池的概念及其应用。我们将讨论为什么...
Java线程池应用
ThreadPool 线程池类 DEFAULT_POOL_SIZE 默认线程池大小 threadPool 线程队列 taskQueue 任务队列 poolSize 自定义线程池大小 通过构造启动该线程池,调用addTask 方法将task任务传入,线程池会自动分配线程去执行...
本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)多线程线程池”的应用,结合具体的代码实例来帮助理解这些概念。 首先,多线程是指在一个程序中同时执行多个不同的线程,以实现并行处理。在...
线程池介绍,介绍应用中如何使用线程池,开启线程池。
使用jdk1.5 实现的线程池. 可以定制人物和其它特性. 下载后可以自己进行相关功能完善. 欢迎加QQ:934547801一起讨论
六、线程池应用场景与实践 6.1 服务器应用 6.2 数据处理与计算密集型任务 6.3 图形界面与事件驱动程序 七、C++线程池高级应用与实际案例 7.1 基于负载均衡的任务分配策略 7.2 线程池性能优化技巧 八、实际案例分析与...
本文将深入探讨如何在C语言中实现一个简单的线程池应用层,并关注其中的关键技术,如双向循环链表、带参宏、管道通信以及二级指针的使用。 首先,线程池的概念基于预先创建一组线程,它们在需要时执行任务,而不是...
以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...
在这个“易语言-常用多线程模板与鱼刺类多线程线程池应用小例子”中,我们将探讨多线程编程在易语言中的应用,以及如何利用线程池来优化并发执行。 1. **多线程概念**:在计算机程序中,多线程是指一个程序内可以...
`ThreadPoolApp`这个文件名可能是指一个包含线程池应用实例的项目或源代码文件。在这个应用中,我们可以预期找到关于如何初始化线程池,如何提交任务到线程池,以及如何管理线程池生命周期的代码。源码分析可能包括...
描述提到它是针对Qt 4.8.6版本编写的,并且可以直接运行,这意味着它包含了一个完整的、可以运行的线程池应用实例。 线程池是一种线程使用模式,它预先创建一定数量的线程,这些线程在空闲时等待新的任务。当有新...
4. **Binder线程池应用**:在Android的Binder通信中,由于Binder操作是在单独的线程中执行的,如果直接在主线程中处理大量或耗时的Binder请求,可能会阻塞UI线程,导致用户体验下降。因此,使用线程池可以将这些任务...
在描述中提到的"很经典的一个线程池应用"可能指的是一个开源库,如Android的`AsyncTask`或者更先进的`OkHttp`的调度器,它们都提供了线程池管理的实现。这些框架通常会根据任务类型和系统资源智能地调整线程数量,以...
1. **ArrayBlockingQueue**:基于数组的有界阻塞队列,公平或非公平的锁实现,适合大多数线程池应用场景。 2. **LinkedBlockingQueue**:基于链表结构的无界阻塞队列,吞吐量通常高于ArrayBlockingQueue,但在高并发...