- 浏览: 466673 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yuan_bin1990:
您好,请问下demo如何运行啊,准备研究研究,但不知道入口啊。 ...
ssh2(struts2+spring2.5+hibernate3.3)自动生成代码程序 -
luyulong:
[b][/b][i][/i][ ...
jQuery进度条插件 jQuery progressBar -
txin0814:
mark..
读取文件目录 -
vurses:
[align=center][color=red][size= ...
include 与 jsp:include区别 -
Roshan2:
http://lijiejava.iteye.com/blog ...
Spring AOP 入门实例
1)threadpool.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <config>
- <threadPool>
- <minPools>10</minPools> <!--线程池最小线程-->
- <maxPools>100</maxPools> <!--线程池最大线程-->
- <checkThreadPeriod>5</checkThreadPeriod> <!--检查线程池中线程的周期5分钟-->
- </threadPool>
- </config>
<?xml version="1.0" encoding="UTF-8"?> <config> <threadPool> <minPools>10</minPools> <!--线程池最小线程--> <maxPools>100</maxPools> <!--线程池最大线程--> <checkThreadPeriod>5</checkThreadPeriod> <!--检查线程池中线程的周期5分钟--> </threadPool> </config>
(2)解析XML文件
- import java.io.InputStream;
- import java.util.Iterator;
- import org.dom4j.Document;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.springframework.core.io.ClassPathResource;
- public class XMLReader {
- private Document document;
- private static final XMLReader instance =
- new XMLReader();
- /**
- * 私有的默认构造子
- */
- private XMLReader() {
- loadXML();
- }
- /**
- * 静态工厂方法
- */
- public static XMLReader getInstance()
- {
- return instance;
- }
- private void loadXML(){
- InputStream is = null;
- SAXReader reader =null;
- try {
- is = (new ClassPathResource("threadpool.xml")).getInputStream();
- reader = new SAXReader();
- document = reader.read(is);
- is.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 读取指定值
- * @param name
- * @return
- */
- public String getThreadPoolPara(String name){
- String str = "";
- try {
- Element root = document.getRootElement(); // 获得根元素
- Iterator lv = root.elementIterator("threadPool");
- Element el = null;
- while (lv.hasNext()) {
- el = (Element) lv.next();
- str = el.element(name).getText();
- }
- } catch (Exception e) {
- System.out.println(e.toString());
- }
- return str;
- }
- }
import java.io.InputStream; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.springframework.core.io.ClassPathResource; public class XMLReader { private Document document; private static final XMLReader instance = new XMLReader(); /** * 私有的默认构造子 */ private XMLReader() { loadXML(); } /** * 静态工厂方法 */ public static XMLReader getInstance() { return instance; } private void loadXML(){ InputStream is = null; SAXReader reader =null; try { is = (new ClassPathResource("threadpool.xml")).getInputStream(); reader = new SAXReader(); document = reader.read(is); is.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 读取指定值 * @param name * @return */ public String getThreadPoolPara(String name){ String str = ""; try { Element root = document.getRootElement(); // 获得根元素 Iterator lv = root.elementIterator("threadPool"); Element el = null; while (lv.hasNext()) { el = (Element) lv.next(); str = el.element(name).getText(); } } catch (Exception e) { System.out.println(e.toString()); } return str; } }
(3)工作线程
- class WorkThread extends Thread {
- private boolean runningFlag;
- private String argument;
- public boolean isRunning() {
- return runningFlag;
- }
- public synchronized void setRunning(boolean flag) {
- runningFlag = flag;
- if (flag)
- this.notify();
- }
- public String getArgument() {
- return this.argument;
- }
- public void setArgument(String string) {
- argument = string;
- }
- public WorkThread(int threadNumber) {
- runningFlag = false;
- System.out.println("thread " + threadNumber + "started.");
- }
- public synchronized void run() {
- try {
- while (true) {
- if (!runningFlag) {
- this.wait();
- } else {
- System.out.println("processing " + getArgument()
- + "... done.");
- sleep(5000);
- System.out.println("Thread is sleeping...");
- setRunning(false);
- }
- }
- } catch (InterruptedException e) {
- System.out.println("Interrupt");
- }
- }
- }
class WorkThread extends Thread { private boolean runningFlag; private String argument; public boolean isRunning() { return runningFlag; } public synchronized void setRunning(boolean flag) { runningFlag = flag; if (flag) this.notify(); } public String getArgument() { return this.argument; } public void setArgument(String string) { argument = string; } public WorkThread(int threadNumber) { runningFlag = false; System.out.println("thread " + threadNumber + "started."); } public synchronized void run() { try { while (true) { if (!runningFlag) { this.wait(); } else { System.out.println("processing " + getArgument() + "... done."); sleep(5000); System.out.println("Thread is sleeping..."); setRunning(false); } } } catch (InterruptedException e) { System.out.println("Interrupt"); } } }
(4)管理线程池
- import java.util.*;
- class ThreadPoolManager {
- private int maxPools;
- private int minPools;
- private int checkThreadPeriod;
- // private java.util.Timer timer = null;
- public Vector vector;
- @SuppressWarnings("unchecked")
- public ThreadPoolManager() {
- setMaxPools(Integer.parseInt(XMLReader.getInstance().getThreadPoolPara("maxPools")));
- setMinPools(Integer.parseInt(XMLReader.getInstance().getThreadPoolPara("minPools")));
- setCheckThreadPeriod(Integer.parseInt(XMLReader.getInstance().getThreadPoolPara("checkThreadPeriod")));
- System.out.println("Starting thread pool...");
- vector = new Vector();
- for (int i = 1; i <= minPools; i++) {
- WorkThread thread = new WorkThread(i);
- vector.addElement(thread);
- thread.start();
- }
- // timer = new Timer(true);
- // timer.schedule(new CheckThreadTask(this),0,checkThreadPeriod);
- }
- @SuppressWarnings("unchecked")
- public void process(String argument) {
- int i;
- for (i = 0; i < vector.size(); i++) {
- WorkThread currentThread = (WorkThread) vector.elementAt(i);
- if (!currentThread.isRunning()) {
- System.out.println("Thread " + (i + 1) + " is processing:"
- + argument);
- currentThread.setArgument(argument);
- currentThread.setRunning(true);
- return;
- }
- if(i == vector.size()-1){//没的空闲线程了,就新建一个
- if(vector.size() < maxPools){
- WorkThread thread = new WorkThread(i);
- vector.addElement(thread);
- thread.setArgument(argument);
- thread.setRunning(true);
- thread.start();
- }
- }
- }
- if (i == maxPools) {
- System.out.println("pool is full, try in another time.");
- }
- }
- public int getCheckThreadPeriod() {
- return checkThreadPeriod;
- }
- public void setCheckThreadPeriod(int checkThreadPeriod) {
- this.checkThreadPeriod = checkThreadPeriod;
- }
- public int getMaxPools() {
- return maxPools;
- }
- public void setMaxPools(int maxPools) {
- this.maxPools = maxPools;
- }
- public int getMinPools() {
- return minPools;
- }
- public void setMinPools(int minPools) {
- this.minPools = minPools;
- }
- }// end of class ThreadPoolManager
import java.util.*; class ThreadPoolManager { private int maxPools; private int minPools; private int checkThreadPeriod; // private java.util.Timer timer = null; public Vector vector; @SuppressWarnings("unchecked") public ThreadPoolManager() { setMaxPools(Integer.parseInt(XMLReader.getInstance().getThreadPoolPara("maxPools"))); setMinPools(Integer.parseInt(XMLReader.getInstance().getThreadPoolPara("minPools"))); setCheckThreadPeriod(Integer.parseInt(XMLReader.getInstance().getThreadPoolPara("checkThreadPeriod"))); System.out.println("Starting thread pool..."); vector = new Vector(); for (int i = 1; i <= minPools; i++) { WorkThread thread = new WorkThread(i); vector.addElement(thread); thread.start(); } // timer = new Timer(true); // timer.schedule(new CheckThreadTask(this),0,checkThreadPeriod); } @SuppressWarnings("unchecked") public void process(String argument) { int i; for (i = 0; i < vector.size(); i++) { WorkThread currentThread = (WorkThread) vector.elementAt(i); if (!currentThread.isRunning()) { System.out.println("Thread " + (i + 1) + " is processing:" + argument); currentThread.setArgument(argument); currentThread.setRunning(true); return; } if(i == vector.size()-1){//没的空闲线程了,就新建一个 if(vector.size() < maxPools){ WorkThread thread = new WorkThread(i); vector.addElement(thread); thread.setArgument(argument); thread.setRunning(true); thread.start(); } } } if (i == maxPools) { System.out.println("pool is full, try in another time."); } } public int getCheckThreadPeriod() { return checkThreadPeriod; } public void setCheckThreadPeriod(int checkThreadPeriod) { this.checkThreadPeriod = checkThreadPeriod; } public int getMaxPools() { return maxPools; } public void setMaxPools(int maxPools) { this.maxPools = maxPools; } public int getMinPools() { return minPools; } public void setMinPools(int minPools) { this.minPools = minPools; } }// end of class ThreadPoolManager
(5)调用
- public static void main(String[] args) {
- try {
- BufferedReader br = new BufferedReader(new InputStreamReader(
- System.in));
- String s;
- ThreadPoolManager manager = new ThreadPoolManager();
- while ((s = br.readLine()) != null) {
- manager.process(s);
- }
- } catch (IOException e) {
- }
- }
public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); String s; ThreadPoolManager manager = new ThreadPoolManager(); while ((s = br.readLine()) != null) { manager.process(s); } } catch (IOException e) { } }
(6)具有线程池的工作队列
我们通常想要的是同一组固定的工作线程相结合的工作队列,它使用 wait() 和 notify() 来通知等待线程新的工作已经到达了。该工作队列通常被实现成具有相关监视器对象的某种链表。
- public class WorkQueue
- {
- private final int nThreads;
- private final PoolWorker[] threads;
- private final LinkedList queue;
- public WorkQueue(int nThreads)
- {
- this.nThreads = nThreads;
- queue = new LinkedList();
- threads = new PoolWorker[nThreads];
- for (int i=0; i<nThreads; i++) {
- threads[i] = new PoolWorker();
- threads[i].start();
- }
- }
- public void execute(Runnable r) {
- synchronized(queue) {
- queue.addLast(r);
- queue.notify();
- }
- }
- private class PoolWorker extends Thread {
- public void run() {
- Runnable r;
- while (true) {
- synchronized(queue) {
- while (queue.isEmpty()) {
- try
- {
- queue.wait();
- }
- catch (InterruptedException ignored)
- {
- }
- }
- r = (Runnable) queue.removeFirst();
- }
- // If we don't catch RuntimeException,
- // the pool could leak threads
- try {
- r.run();
- }
- catch (RuntimeException e) {
- // You might want to log something here
- }
- }
- }
- }
- }
public class WorkQueue { private final int nThreads; private final PoolWorker[] threads; private final LinkedList queue; public WorkQueue(int nThreads) { this.nThreads = nThreads; queue = new LinkedList(); threads = new PoolWorker[nThreads]; for (int i=0; i<nThreads; i++) { threads[i] = new PoolWorker(); threads[i].start(); } } public void execute(Runnable r) { synchronized(queue) { queue.addLast(r); queue.notify(); } } private class PoolWorker extends Thread { public void run() { Runnable r; while (true) { synchronized(queue) { while (queue.isEmpty()) { try { queue.wait(); } catch (InterruptedException ignored) { } } r = (Runnable) queue.removeFirst(); } // If we don't catch RuntimeException, // the pool could leak threads try { r.run(); } catch (RuntimeException e) { // You might want to log something here } } } } }
大多数专家建议使用 notifyAll() 而不是 notify() ,而且理由很充分:使用 notify() 具有难以捉摸的风险,只有在某些特定条件下使用该方法才是合适的。另一方面,如果使用得当, notify() 具有比 notifyAll() 更可取的性能特征;特别是, notify() 引起的环境切换要少得多,这一点在服务器应用程序中是很重要的。
发表评论
-
javascript 打印指定区域
2010-11-18 16:34 1584javascript网页html 打印指定区域在一张网页里面, ... -
MyEclipse 8.5 开发环境配置,汉化,Aptana2.0插件,SVN 插件,Flex Builder 3/4 插件安装
2010-10-26 14:27 1545MyEclipse 8.5 开发环境配置,汉化,Aptana2 ... -
java读取properties文件
2010-10-11 13:43 767使用J2SE API读取Properties文件的六种方法 1 ... -
dbcp基本配置和重连配置
2010-09-28 09:29 2663最近在看一些dbcp的相 ... -
JAVA实现文件转移
2010-09-28 09:26 945/** * //1.从旧文件拷贝内容到新文件 ... -
Properties读取类
2010-09-25 14:06 948package cn.feigme.util; ... -
JAVA读写ftp
2010-09-21 16:41 3538import java.io.DataInputStream; ... -
apache tomcat mysql负载均衡和集群
2010-09-14 10:30 1690前言:公司开发了一个网站,估计最高在线人数是3万,并发人数最多 ... -
Flash Builder 4 正式版序列号
2010-09-01 15:51 3978江湖上又出现新的FlashBuilder(Flex4)序列号: ... -
利用 org.apache.commons.io.FileUtils快速读写文件
2010-08-17 10:33 2724利用 org.apache.commons.io.FileUt ... -
netbeans常用快捷键
2010-08-10 16:26 9061、Application应用程序的 ... -
ERWIN7.1注册码
2010-06-23 12:15 1359终于找到ERWIN7.1注册码,也可在ERWIN7.2上注册。 ... -
Java压缩文件zip
2010-06-21 09:42 1137可以使用jdk提供的java.util.zip包的类来进行文件 ... -
文件资源操作
2010-06-16 21:52 10861.访问文件资源 假设有一个文件地位于 ... -
Java Regex To Use
2010-06-16 21:46 807Java代码 /** * 得到 ... -
Java Random and Java Disabuse
2010-06-16 21:46 1123一、Random 1、创建Random ... -
使用ThreadLocal,隔离多个线程之间的共享冲突
2010-06-16 21:29 1540早在Java 1.2推出之时,Java平台中就引入了一个新的 ... -
MyEclipse下开发Web Service
2010-06-16 21:28 1524开发环境 Sun Java 5+ ... -
jexcel使用
2010-06-16 21:23 1457Java代码 package excel.jx ... -
用dom4j读写xml
2010-06-16 21:20 898一、例子 Java代码 public c ...
相关推荐
java线程池使用后到底要关闭吗 java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠性。然而,在使用java线程池时,一个常见的问题是:使用完线程池后到底要不要关闭?...
"Java 线程池完整代码解析" Java 线程池是 Java 语言中的一个重要概念,它允许开发者创建和管理多个线程,以提高程序的并发性和性能。下面是对给定文件的解析,包括 title、description、标签和部分内容的解析。 ...
Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...
java线程池知识、
Java线程池是一种高效管理线程资源的工具,它能够帮助开发者有效地控制并调度线程,从而提升系统性能,减少系统资源的浪费。在Java中,`ExecutorService`接口是线程池的主要入口,它是`java.util.concurrent`包的一...
Java线程池是Java并发编程中的重要组件,它能够有效地管理和复用线程,从而提高程序的执行效率和降低资源消耗。在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,...
Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...
### 自定义实现Java线程池 #### 一、概述 在深入探讨自定义Java线程池之前,我们先简要回顾一下线程池的基本概念及其重要性。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动...
Java线程池是Java并发编程中的重要组成部分,它在多线程和高并发场景下扮演着关键角色。本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要...
Java线程池是一种高效管理线程资源的工具,它的出现是为了应对多线程编程中频繁创建和销毁线程带来的性能开销以及资源消耗。在Java中,通过使用线程池,我们可以预先创建一定数量的线程,这些线程在空闲时可以被复用...
Java线程池是Java并发编程中的重要组成部分,它允许开发者管理多个线程并有效地调度任务。线程池通过ThreadPoolExecutor类实现,这是一个高度可配置的工具,能够根据具体需求定制线程的创建、管理和销毁策略。 ...
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
Java线程池是一种高级的多线程处理框架,它是Java并发编程中非常重要的一个组件。线程池的原理和实现涉及到操作系统调度、内存管理和并发控制等多个方面。理解线程池的工作原理有助于优化程序性能,避免过度创建和...
2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...
Java线程池是一种高效管理并发任务的机制,它允许开发者预先配置一定数量的线程,以便在处理多个并发任务时能有效地复用这些线程,从而避免了频繁创建和销毁线程带来的开销。在Java中,`java.util.concurrent`包下的...
基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池...
Java线程池是一种高效利用系统资源、管理并发执行任务的机制。它的原理是通过预先创建一组线程,这些线程在任务到来时可以立即执行,而不是每次需要执行任务时都新建线程,从而降低了线程创建和销毁带来的开销。...
Java线程池是Java并发编程中的重要组成部分,它允许开发者高效地管理多个并发执行的线程,有效地控制系统的资源消耗,提高系统性能和稳定性。在Java中,`java.util.concurrent`包提供了`ExecutorService`接口及其...
讲述了java线程池的优点,参数,6种线程池的使用场景,线程池用到的handler,线程任务的提交方式等等。