`
redsky008
  • 浏览: 352387 次
  • 性别: Icon_minigender_1
  • 来自: 成都正在项目
社区版块
存档分类
最新评论

另一个线程池ThreadPool,感觉比之前发的那个JDK自带的好用

阅读更多
import java.util.LinkedList;

public class ThreadPool extends ThreadGroup {
  private boolean isClosed=false;  //线程池是否关闭
  public LinkedList<Runnable> workQueue;  //表示工作队列
  private static int threadPoolID;  //表示线程池ID
  private int threadID;  //表示工作线程ID

  public ThreadPool(int poolSize) { //poolSize指定线程池中的工作线程数目
    super("ThreadPool-" + (threadPoolID++));
    setDaemon(true);
    workQueue = new LinkedList<Runnable>();  //创建工作队列
    for (int i=0; i<poolSize; i++)
      new WorkThread().start();  //创建并启动工作线程
  }

/** 向工作队列中加入一个新任务,由工作线程去执行该任务 */
  public synchronized void execute(Runnable task) {
    if (isClosed) { //线程池被关则抛出IllegalStateException异常
      throw new IllegalStateException();
    }
    if (task != null) {
      workQueue.add(task);
      notify();  //唤醒正在getTask()方法中等待任务的工作线程
    }
  }

  /** 从工作队列中取出一个任务,工作线程会调用此方法 */
  protected synchronized Runnable getTask()throws InterruptedException{
    while (workQueue.size() == 0) {
      if (isClosed) return null;
      wait();  //如果工作队列中没有任务,就等待任务
    }
    return workQueue.removeFirst();
  }

  /** 关闭线程池 */
  public synchronized void close() {
    if (!isClosed) {
      isClosed = true;
      workQueue.clear(); //清空工作队列
      interrupt();  //中断所有的工作线程,该方法继承自ThreadGroup类
    }
}

  /** 等待工作线程把所有任务执行完 */
  public void join() {
    synchronized (this) {
      isClosed = true;
      notifyAll();  //唤醒还在getTask()方法中等待任务的工作线程
    }

    Thread[] threads = new Thread[activeCount()];
    //enumerate()方法继承自ThreadGroup类,获得线程组中当前所有活着的工作线程
    int count = enumerate(threads); 
    for (int i=0; i<count; i++) { //等待所有工作线程运行结束
      try {
        threads[i].join();  //等待工作线程运行结束
        System.out.println("已完成一个任务!!");
      }catch(InterruptedException ex) { }
    }
  }

  /**  内部类:工作线程  */
  private class WorkThread extends Thread {
    public WorkThread() {
      //加入到当前ThreadPool线程组中
      super(ThreadPool.this,"WorkThread-" + (threadID++));
    }

    public void run() {
      while (!isInterrupted()) {  //isInterrupted()方法继承自Thread类,判断线程是否被中断
      Runnable task = null;
        try { //得到任务
          task = getTask();
        }catch (InterruptedException ex){}

        // 如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
        if (task == null) return;
       
        try { //运行任务,捕获异常
          task.run();
        } catch (Throwable t) {
          t.printStackTrace();
        }
      }//#while
    }//#run()
  }//#WorkThread类
}
分享到:
评论

相关推荐

    线程池threadpool_src

    线程池是一种多线程处理形式,它将预先创建好的一组线程维护在一个池中,以便重复使用,而不是每次需要时都创建新的线程。这种技术可以有效地管理和控制并发执行的任务,提高系统的性能和资源利用率。 在“线程池...

    C++11 线程池 ThreadPool

    C++11是C++语言的一个重要版本更新,它引入了大量的新特性,其中包括对多线程的支持。线程池(ThreadPool)是一种管理线程资源的有效方式,它在现代并发编程中扮演着至关重要的角色。线程池允许程序预先创建一组线程...

    线程池ThreadPool

    线程池ThreadPool。

    java线程池threadpool简单使用源码

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...

    C++ 实现线程池ThreadPool

    线程池(ThreadPool)是多线程编程中的一个重要概念,它是一种线程使用模式,用于高效地管理和调度线程资源。在C++中实现线程池可以帮助开发者优化并发执行的任务,减少线程创建和销毁的开销,提高系统效率。下面...

    一个c实现的线程池threadpool-0.1

    一个c实现的线程池threadpool-0.1,有测试代码 This is an implementation for the following requirements: http://paul.rutgers.edu/~csgates/CS416/proj2/index.html Reports of successful use are ...

    DELPHI的ThreadPool的线程池DEMO

    - **线程池**:是一组预创建的线程,它们共享一个工作队列,等待分配的任务被添加到队列中。线程池中的线程会自动从队列中取出任务并执行,当所有线程都在执行任务时,新任务会被放入队列等待。 2. **DELPHI线程池...

    线程池 threadpool

    线程池(ThreadPool)是一种多线程编程的高级管理机制,它通过预先创建一组线程并维护一个线程集合,来高效地处理并发任务。在Windows API中,线程池被广泛使用,提供了诸如CreateThreadPool、CloseThreadPool、...

    ThreadPool 线程池管理单元

    ThreadPool 线程池管理单元 带调用例子

    Java版线程池ThreadPool.zip

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它是多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效控制运行的线程数量,如果线程数量超过了最大数量,...

    线程池 threadPool c语言实现

    它维护一个线程列表,当有新的任务到来时,会从空闲线程中选择一个来执行任务,如果所有线程都在忙,那么任务会被放入一个等待队列。 2. **任务队列**:任务队列用来存放待执行的任务,通常是一个先进先出(FIFO)...

    VC++ 线程池(ThreadPool)实现

    当一个任务被提交到线程池时,线程池会自动选择一个空闲线程来执行任务,而不是每次都创建新的线程,这可以减少线程创建和销毁的开销。线程池还可以根据需要动态调整线程数量,以适应系统负载的变化。 VC++线程池的...

    完全解析Android多线程中线程池ThreadPool的原理和使用

    线程池ThreadPool是指一个池子中包含多个线程的集合,用于管理和维护多个线程的生命周期,提高系统的并发处理能力和响应速度。 了解线程池ThreadPool的原理和使用是Android开发者必须掌握的知识点。下面将详细讲解...

    python线程池threadpool实现篇

    1. 线程池的创建:创建一个ThreadPool实例,通过ThreadPool类的构造函数,可以设置工作线程数量(num_workers),任务队列大小(q_size),结果队列大小(resq_size),以及轮询超时时间(poll_timeout)。...

    threadpool 线程池 C语言版

    当有新的任务到来时,线程池会从待命的线程中选择一个来执行任务,而不是每次都创建新的线程,这样可以避免频繁创建和销毁线程带来的开销。任务队列是线程池的核心组成部分,用于存储待处理的任务,线程从队列中取出...

    Quartz 线程池

    2. **任务分配**:当一个 Trigger 触发时,调度器会从线程池中选择一个空闲线程,分配给 Job 执行。如果所有线程都在忙碌,新的 Trigger 将被暂时挂起,等待线程池中有线程可用。 3. **任务执行**:线程执行 ...

    微软的线程池API ThreadPool

    线程池API是微软.NET Framework中的一个重要组成部分,它在`System.Threading`命名空间下提供了一系列高效、可管理的多线程编程接口。线程池的主要目的是优化系统资源的使用,减少线程创建和销毁的开销,提高系统的...

    python线程池threadpool使用篇

    main函数中,首先创建了一个设备列表device_list,接着创建了一个拥有8个线程的线程池ThreadPool。通过遍历设备列表,我们为每个设备创建了相应的任务请求,并将这些任务请求添加到request_list中。然后通过map函数...

    c# 线程池的管理 通过ThreadPool

    线程池的工作原理是预先创建一组线程,当需要执行任务时,它会从池中分配一个空闲线程,而不是每次都创建新的线程。这样可以减少线程创建和销毁的开销,因为创建和销毁线程是相对昂贵的操作。线程池还可以根据需要...

    Java8并行流中自定义线程池操作示例

    下面的例子中,我们有一个并行流,这个并行流使用了一个自定义的线程池去计算1到 1,000,000的和。 知识点:可以使用ForkJoinPool的构造方法并设定并行级别来创建一个自定义的线程池。 4. 总结 我们简要地看了一下...

Global site tag (gtag.js) - Google Analytics