<%@ page contentType="text/html; charset=gb2312"%> 简单的线程池
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
简单的线程池
     发布者: 发布时间:2006-11-17
 HTTP 代理服务器,发现访问网页时建立的连接很多,消耗的线程也非常的多,对于系统是一个不小的开销.而且这些线程存在的时间都很短,99%以上的线程存在的时间都在毫秒的等级,相对来说线程的建立的注销就占了绝大部分的CPU时间。

    一个很小的线程池.
    代码如下(一共2个类):
    /*
    *一个简单的线程池 ThreadPool .java
    */
    public class ThreadPool {
    //以下是配置信息,可以更改
    static int MAX_THREAD = 1000; //未使用
    static int MIN_THREAD = 14;
 
    static int id = 1; //线程 ID 号,主要用于监视线程的工作情况
 
    static private ThreadPool pool = new ThreadPool();
    static public ThreadPool getThreadPool() {
    return pool;
    }
 
    Stack<WorkThread> stack = new Stack<WorkThread>(MIN_THREAD);
    private ThreadPool() {
    }
 
    synchronized public boolean putWorkThread(WorkThread wt) {
    if(stack.size()<MIN_THREAD){
    stack.push(wt);
    return true;
    } else {
    return false;
    }
    }
 
    synchronized public WorkThread getWorkThread() {
    WorkThread wt = null;
    if(stack.isEmpty()) {
    wt = new WorkThread(this);
    new Thread(wt,"线程ID:"+id).start();
    id++;
    } else {
    wt = stack.pop();
    }
    return wt;
    }
    }
    --------------------------------------------------------------------------
    /*
    *工作线程类 WorkThread.java
    */
    public class WorkThread implements Runnable {
    Object lock = new Object();
    Runnable runner = null;
    ThreadPool pool = null;
 
    public WorkThread(ThreadPool pool) {
    this.pool = pool;
    }
 
    public void start(Runnable r) {
    runner = r;
    synchronized(lock) {
    lock.notify();
    }
    }
 
    public void run() {
    while(true) {
    if(runner != null) {
    runner.run();
    runner = null; //及时回收资源
    }
    if(pool.putWorkThread(this)) {
    System.out.println (Thread.currentThread().getName()+" 被回收!");
    synchronized(lock) {
    try {
    lock.wait();
    } catch (InterruptedException ie) {
    System.out.println ("停止线程时出现异常");
    }
    }
    } else {
    System.out.println (Thread.currentThread().getName()+" 被丢弃!");
    break;
    }
    }
    }
    }

    使用方法:
    Runnable r = ......;
    new Thread(r).start();
    这是你以前的代码,使用线程池只需要将后一句变成
    ThreadPool.getThreadPool().getWorkThread().start(r);
    就可以了,其他的代码不用任何更改.

    这个线程池还有两个功能没有实现:
    1.最大线程数的控制
    2.空闲线程等待一定时间后自动注销
    但这个线程池也有一个好处--可以随时改变最小线程的数量.

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
基于JSON的高级AJAX开发技术
另类查询 Hibernate HQL 深度历险
Java的多进程运行模式分析
基于JDBC的数据库连接池技术研究与应用
JSP中查询结果分页
Servlet中如何捕获Session事件
 
最近评论:
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(892)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(2673)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号