线程池2 : 线程池 « 线程 « Java

En
Java
1. 图形用户界面
2. 三维图形动画
3. 高级图形
4. 蚂蚁编译
5. Apache类库
6. 统计图
7. 
8. 集合数据结构
9. 数据类型
10. 数据库JDBC
11. 设计模式
12. 开发相关类
13. EJB3
14. 电子邮件
15. 事件
16. 文件输入输出
17. 游戏
18. 泛型
19. GWT
20. Hibernate
21. 本地化
22. J2EE平台
23. 基于J2ME
24. JDK-6
25. JNDI的LDAP
26. JPA
27. JSP技术
28. JSTL
29. 语言基础知识
30. 网络协议
31. PDF格式RTF格式
32. 映射
33. 常规表达式
34. 脚本
35. 安全
36. Servlets
37. Spring
38. Swing组件
39. 图形用户界面
40. SWT-JFace-Eclipse
41. 线程
42. 应用程序
43. Velocity
44. Web服务SOA
45. 可扩展标记语言
Java 教程
Java » 线程 » 线程池屏幕截图 
线程池2
线程池2
 
/*
 *
 * Copyright (c) 1997-1999 Scott Oaks and Henry Wong. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL purposes and
 * without fee is hereby granted.
 *
 * This sample source code is provided for example only,
 * on an unsupported, as-is basis. 
 *
 * AUTHOR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. AUTHOR SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 *
 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  AUTHOR
 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
 * HIGH RISK ACTIVITIES.
 */

import java.util.*;

public class ThreadPool {

  class ThreadPoolRequest {
    Runnable target;
    Object lock;

    ThreadPoolRequest(Runnable t, Object l) {
      target = t;
      lock = l;
    }
  }

  class ThreadPoolThread extends Thread {
    ThreadPool parent;
    boolean shouldRun = true;

    ThreadPoolThread(ThreadPool parent, int i) {
      super("ThreadPoolThread " + i);
      this.parent = parent;
    }

    public void run() {
      ThreadPoolRequest obj = null;
      while (shouldRun) {
        try {
          parent.cvFlag.getBusyFlag();
          while (obj == null && shouldRun) {
            try {
              obj = (ThreadPoolRequest)
                  parent.objects.elementAt(0);
              parent.objects.removeElementAt(0);
            catch (ArrayIndexOutOfBoundsException aiobe) {
              obj = null;
            catch (ClassCastException cce) {
              System.err.println("Unexpected data");
              obj = null;
            }
            if (obj == null) {
              try {
                parent.cvAvailable.cvWait();
              catch (InterruptedException ie) {
                return;
              }
            }
          }
        finally {
          parent.cvFlag.freeBusyFlag();
        }
        if (!shouldRun)
          return;
        obj.target.run();
        try {
          parent.cvFlag.getBusyFlag();
          nObjects--;
          if (nObjects == 0)
            parent.cvEmpty.cvSignal();
        finally {
          parent.cvFlag.freeBusyFlag();
        }
        if (obj.lock != null) {
          synchronized(obj.lock) {
            obj.lock.notify();
          }
        }
        obj = null;
      }
    }
  }

  Vector objects;
  int  nObjects = 0;
  CondVar cvAvailable, cvEmpty;
  BusyFlag cvFlag;
  ThreadPoolThread poolThreads[];
  boolean terminated = false;

  public ThreadPool(int n) {
    cvFlag = new BusyFlag();
    cvAvailable = new CondVar(cvFlag);
    cvEmpty = new CondVar(cvFlag);
    objects = new Vector();
    poolThreads = new ThreadPoolThread[n];
    for (int i = 0; i < n; i++) {
      poolThreads[inew ThreadPoolThread(this, i);
      poolThreads[i].start();
    }
  }

  private void add(Runnable target, Object lock) {
    try {
      cvFlag.getBusyFlag();
      if (terminated)
        throw new IllegalStateException("Thread pool has shutdown");
      objects.addElement(new ThreadPoolRequest(target, lock));
      nObjects++;
      cvAvailable.cvSignal();
    finally {
      cvFlag.freeBusyFlag();
    }
  }

  public void addRequest(Runnable target) {
    add(target, null);
  }

  public void addRequestAndWait(Runnable target)
              throws InterruptedException {
    Object lock = new Object();
    synchronized(lock) {
      add(target, lock);
      lock.wait();
    }
  }

  public void waitForAll(boolean terminatethrows InterruptedException {
    try {
      cvFlag.getBusyFlag();
      while (nObjects != 0)
        cvEmpty.cvWait();
      if (terminate) {
        for (int i = 0; i < poolThreads.length; i++)
          poolThreads[i].shouldRun = false;
        cvAvailable.cvBroadcast();
        terminated = true;
      }
    finally {
      cvFlag.freeBusyFlag();
    }
  }

  public void waitForAll() throws InterruptedException {
    waitForAll(false);
  }
}



           
         
  
Related examples in the same category
1. 定义一个线程的线程池定义一个线程的线程池
2. 线程池演示
3. 线程池1
4. 线程池2线程池2
5. 线程池
6. 线程池试验线程池试验
7. JDK1.5,创造一批计划任务
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.