- 浏览: 158875 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
liuyutingat163:
建议参考一篇更详细jdk安装和环境变量配置的教程jdk环境变量 ...
JDK1.6 tomcat 6.0环境变量配置 -
sessionsong:
学习了!O(∩_∩)O谢谢
JS 获取本地文件夹的文件列表[转] -
阿图是会飞的猪:
Mark,正在用这个控件
DevExpress控件之XtraTreeList -
yhjhoo:
太骗人了!第二步中的工具根本就不工作
GeoServer+MySQL安装及配置过程 -
念Queen:
解决不了问题
JS关闭当前窗口代码
为什么要建立线程池?
在多线程项目中,如果建立的线程过多,反而可能导致运行速度大大减慢,这是由于线程建立所花费的时间和资源都比较多。
所以我们在多线程中必须很好地来管理线程, 在很好利用多线程能“同步工作”的好处之外,更有效地提高程序运行速度。
线程池是什么?
线程池是指具有固定数量的线程组成的一种组件。这些线程用来循环执行多个应用逻辑。
怎么建立线程池?
线程池主要包括4个部分,它们是:
1. 线程管理
主要是用来建立,启动,销毁工作线程和把工作任务加入工作线程。
2. 工作线程
它是真正的线程类,运行工作任务。
3. 工作队列
它是用来封装线程的容器。
4. 工作任务
它是实现应用逻辑的具体类。
线程管理类:
工作线程类:
工作任务接口: 工作任务类: 线程池测试类:
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* ThreadPoolManager.java
*
* Copyright (C) 2008 State Street Corporation. All Rights Reserved.
*
*/
/**
* the thread pool manager, is responsible for starting and stopping the work thread.
*
* @author e458487
* @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
*
* Copyright (C) 2008 State Street Corporation. All Rights Reserved.
*
*/
/**
* the work thread used pull the task of task queue, and execute it.
*
* @author e458487
* @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
*
* Copyright (C) 2008 State Street Corporation. All Rights Reserved.
*
*/
/**
* The task want to execute.
*
* @author e458487
* @version 1.0
*/
public interface Task {
public void execute();
}
/**
* SimpleTask.java
*
* Copyright (C) 2008 State Street Corporation. All Rights Reserved.
*
*/
/**
* @author e458487
* @version 1.0
*/
public class SimpleTask implements Task {
/* (non-Javadoc)
* @see Task#execute()
*/
public void execute() {
System.out.println(Thread.currentThread());
}
}
/** * ThreadPoolDemo.java * * Copyright (C) 2008 State Street Corporation. All Rights Reserved. * */ /** * @author e458487 * @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(); } }
发表评论
-
eclipse搭建SSH框架详解[转]
2012-02-21 11:04 1273SSH框架是最常用的框架之一,在搭建SSH框架的时候总有 ... -
Javadoc注释编写细则[转]
2011-02-12 15:01 1729// 注释一行 /* ...... */ ... -
使用 dom4j 解析 XML
2011-01-06 10:10 789dom4j API 包含一 ... -
java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式详解与比较
2011-01-06 10:05 9211.详解 ... -
JDK1.6官方下载_JDK6官方下载地址
2010-10-23 13:41 1165JDK1.6官方下载_JDK6官方下载地址: http://w ... -
Java创建文件夹与创建文件
2010-08-27 10:31 1877jik package test.file; / ... -
Apache Commons Email 简单运用
2010-08-23 16:07 1731Commons Email aims to provide a ... -
Java Servlet API中文说明文档二
2010-08-21 15:18 787一、HttpServletRequest ... -
Java Servlet API中文说明文档
2010-08-21 15:14 860这份文档描述了Java Servlet API的最新版本2 ... -
多线程的一些问题
2010-08-21 14:58 734Java的线程编程非常简单 ... -
Javax.comm串口通讯类简介
2010-08-21 14:40 1409Javax.comm简介 Javax.comm是Sun ... -
jsp环境下ajax乱码问题的解决
2010-08-19 21:38 747AJAX传递中文字符串时必须把中文字符 ... -
ajax+jsp异步无刷新从DB取数据
2010-08-19 21:13 2059ajax应用的基本流程 1、从web表单中获取需要的数据 ... -
GeoServer+MySQL安装及配置过程
2010-08-16 14:00 2262GeoServer的安装配置请参考 http://sime ... -
利用GeoServer搭建高效的WebGIS开发平台(转)
2010-08-16 10:58 2510历经3,4个月终于利用Geoserver搭建起了一个高效的We ... -
JSP文件下载方法及注意
2010-08-12 15:37 1579jsp中实现文件下载 最简单的方式是在网页上做超级链接,如:点 ... -
JDK1.6 tomcat 6.0环境变量配置
2010-08-05 16:16 15887第一步:下载jdk和tomcat:JDK下载 Tomcat下 ...
相关推荐
5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ...
使用Java作为语言基础,服务端使用线程池管理线程,客户端分为读写两个线程分别管理Socket读写操作。其中服务端为解决多线程操作共享资源,确保线程安全摒弃资源消耗大的Synchronized使用ConcurrentHashMap存放...
telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chatserver.java;聊天室客户端,...
Java版精华区 含java jsp及js等精华帖子合集 适合收藏 查询 <br>序号 精华区主题 -------------------------------- 1. [目录]Java教程 1. [目录]Java语言教程 2. [目录]来自java的传说...
5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 Executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...
6.3.1 线程池和Executor 124 6.3.2 Callable和Future 126 6.3.3 ScheduledExecutorService 127 6.4 线程安全的集合和同步器 128 6.4.1 阻塞队列 128 6.4.2 指定阻塞时间 130 6.4.3 同步器 131 6.4.4 Atomic...
使用socket建立客户端与服务器的通信的过程 60.JAVA语言国际化应用,Locale类,Unicode 61.描述反射机制的作用 62.如何读写一个文件? 63.在图形界面中,一个按钮如何处理鼠标点击事件? 64.在图形界面中,一个...
一、搭建服务器端 a)、创建ServerSocket对象绑定监听端口。...d)、关闭响应资源这个项目非常适合学完Java基础来练手,该项目就是对Socket网络编程、IO流、线程及线程池等知识进行一些实战综合运用。
5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...
大多数线程阻塞等待数据响应返回,新的请求无法建立SSL连接,导致整个Jetty线程池都被该服务占用,最终拖垮了整个Jetty,因此我们有必要能把不同HTTP服务隔离到不同的线程池中,即使其中某个HTTP服务的线程池满了也...
6.3.1 线程池和Executor 124 6.3.2 Callable和Future 126 6.3.3 ScheduledExecutorService 127 6.4 线程安全的集合和同步器 128 6.4.1 阻塞队列 128 6.4.2 指定阻塞时间 130 6.4.3 同步器 131 6.4.4 Atomic...
6.3.1 线程池和Executor 124 6.3.2 Callable和Future 126 6.3.3 ScheduledExecutorService 127 6.4 线程安全的集合和同步器 128 6.4.1 阻塞队列 128 6.4.2 指定阻塞时间 130 6.4.3 同步器 131 6.4.4 Atomic...
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置...
本资源为您提供了关于 Java 并发编程理论基础的精讲,涵盖了多线程编程的核心概念、基本原理以及在 Java 中的应用。通过深入学习,您将建立坚实的并发编程基础,能够更好地理解和应对多线程编程中的挑战。 并发编程...
5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...
实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 滚动的...
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7...
5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...