Java线程池实现原理

线程是一个独立的程序执行路径,线程池是一组被重复利用执行任务的线程,充分利用资源提高性能。

线程池

线程池是一组执行任务的工作线程,线程被反复重用,如果,所有线程都处于活动状态,新加入的任务会被放入队列,直到有空闲线程。线程池内部所用的队列通常为LinkedBlockingQueue。

线程池参数

核心线程数

队列容量

最小线程数

最大线程数

固定数量的线程,与队列配合。任务被包装成Runnable对象加入队列,调用notify方法唤醒处于wait中的线程,被唤醒的线程从队列中取出任务并执行,如果,没有空闲的线程,则任务被堆积在队列中。

线程池示意代码

package com.xieyonghui.art;

import java.util.concurrent.LinkedBlockingQueue;

public class ThreadPool {

  public static void main(String... strings) {
    ThreadPool threadPool = new ThreadPool(10);
    for (int i = 0; i < 10; i++) {
      // Task t = new Task();
      // 因为创建内部类对象需要已知外部类对象,
      // 在此就不用threadPool.new Task()的方式;直接用lambda的写法
      threadPool.execute(() -> {
        System.out.println("business");
      });
    }
  }

  /**
   * 线程池的基本结构
   */

  // 线程数量
  private int tpc = 5;
  // (线程)执行单元
  private final Worker[] worker;
  // 任务队列
  private final LinkedBlockingQueue<Runnable> queue;

  // 构造线程池
  public ThreadPool(int thread) {
    queue = new LinkedBlockingQueue();
    worker = new Worker[thread];
    tpc = thread;

    for (int i = 0; i < tpc; i++) {
      worker[i] = new Worker();
      // 启动所有线程并处于等待状态
      worker[i].start();
    }

  }

  // 加入新的任务
  public void execute(Runnable task) {
    synchronized (queue) {
      // 把任务加入队列
      queue.add(task);
      // 然后通知在队列上等待的线程
      queue.notify();
    }
  }

  // 任务执行单元
  class Worker extends Thread {

    @Override
    public void run() {
      Runnable t;
      while (true) {
        synchronized (queue) {
          while (queue.isEmpty()) {
            try {
              // 队列任务为空,则wait
              queue.wait();
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
          // 被唤醒后从队列中取出一个任务
          t = queue.poll();
        }
        try {
          // 执行任务
          t.run();
        } catch (Throwable ex) {
          ex.printStackTrace();
        }
      }
    }

  }

  // 业务逻辑处理单元
  class Task implements Runnable {
    @Override
    public void run() {
      System.out.println("business");
    }

  }

}