• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-04
  • 语言: Java
  • 标签:

资源简介

环境:Windows XP Professional SP3, JDK 1.6 使用步骤: 1.下载解压之后,在控制台运行javac ThreadPoolTest.java 2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来模拟真实的QQ实时聊天软件。因为涉及到Socket编程,所以一定会使用多线程编程。这里本人翻写一个通用的线程池类,它可以用来作为工具类处理许多多线程问题。代码注释非常详尽,一行注释一行代码。 阅读对象:非常熟悉Java的基本概念,并且熟悉命令行编写代码的人员。

资源截图

代码片段和文件信息

import java.util.linkedList;

/**
    功能:一个线程池是一组有限数量的线程,它们被用来完成执行任务
翻写作者:Arkliszeng
时间:2010-02-21
地点:北大青鸟锦江中心学术部
版本:ver 1.0.0
备注:
线程池使用ThreadGroup API来实现.线程组表示一个线程的集合。
此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,
除了初始线程组外,每个线程组都有一个父线程组。允许线程访问
有关自己的线程组的信息,但是不允许它访问有关其线程组的父线
程组或其他任何线程组的信息。

*/
public class ThreadPool extends ThreadGroup {
    private boolean isAlive; //表示线程是否活首
    private linkedList taskQueue; //定义一个双向队列
    private int threadID; //保存线程的ID
    private static int threadPoolID; //表示线程池的ID

    /**
        在构造方法创建线程池
        @参数numThreads用来指定池中的线程个数
    */
    public ThreadPool(int numThreads) {
        super(“线程池-“ + (threadPoolID++));
        setDaemon(true);//让该线程组为精灵线程组

        isAlive = true;//设置初始值为true

        taskQueue = new linkedList();//初始化任务队列
        for (int i=0; i            new PooledThread().start();//启动池中的线程
        }
    }


    /**
        功能:请求一个新的任务来运行,该方法立即返回。然后任务在下一下空闲
         的线程中执行。该方法是线程安全的。
        

任务开始执行时有序的到达时开始。
        @参数task表示运行的任务。如果不null那么没有任务执行。
        @如果本ThreadPool关闭了,那么抛出IllegalStateException。
    */
    public synchronized void runTask(Runnable task) {
     //如果线程池的状态isAlive==false值
        if (!isAlive) {
            throw new IllegalStateException();//那么抛出异常
        }
        //如果任务不为null
        if (task != null) {
         //那么在任务把该任务加入任务阶段
            taskQueue.add(task);
            //然后唤醒空闲的线程执行该任务
            notify();
        }

    }

/**
功能:获取任务对象
*/
    protected synchronized Runnable getTask() throws InterruptedException{
     //如果任务队列不是空的
        while (taskQueue.size() == 0) {
         //如果线程池的状态isAlive==false值
            if (!isAlive) {
                return null; //那么返回null值
            }
            wait();//否则等待任务出现(添加任务)
        }
        //否则任务队列中的一个任务对象
        return (Runnable)taskQueue.removeFirst();
    }


    /**
        功能:关闭该线程池并且立即返回。让所有线程停止执行,并且所有等待任务停止执行。
         一旦一个ThreadPool被关闭了,那么该线程池中的所有的线程不再运行。
    */
    public synchronized void close() {
     //如果线程池是活的
        if (isAlive) {
   //那么置为false
            isAlive = false;
            //然后把任务队列清空
            taskQueue.clear();
            //最后终止线程池中所有线程的运行
            interrupt();
        }
    }


    /**
        功能:关闭该ThreadPool活动然后等待所有的线程运行完成。这样所有等待的任务会被执行。
    */
    public void join() {
        // 当ThreadPool不再活动时唤醒所有等待的线程
        synchronized (this) {
            isAlive = false;
            notifyAll();
        }

        // 然后等待所有池中的线程对象执行完毕
        Thread[] threads = new Thread[activeCount()]; //创建所有池中的活动线程
        //把此线程组及其子组中的所有活动线程复制到指定数组中
        int count = enumerate(threads);
        //然后按序让每个线程执行完毕
        for (int i=0; i            try {
                threads[i].join();
            }
            catch (InterruptedException ex) { }
        }
    }


    /**
        功能:定义线程池中的线程,这些线程对象用来运行任务对象(Runnables)
      


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5259  2010-02-21 15:08  ThreadPool.java

     文件       1673  2010-02-21 15:50  ThreadPoolTest.java

----------- ---------  ---------- -----  ----

                 6932                    2


评论

共有 条评论