天天看点

Java手写线程池(不带返回值、带返回值)不带返回值带返回值

文章目录

  • 不带返回值
  • 带返回值

不带返回值

public class MyThreadPool {

  private static final int DEFAULT_THREAD_NUM = 10;

  private int maxThreadNum;
  private BlockingQueue<Runnable> queue;

  // 初始化worker的时候直接调用start方法
  // 在run中不断从阻塞队列中获取对象
  // 由于已经调用了start方法,是一个新的线程
  // 因此直接调用runnable的run方法就是使用当前线程运行任务
  private class Worker extends Thread {
    @Override
    public void run() {
      try {
        for (; ; ) {
          Runnable runnable = queue.take();
          System.out.println(currentThread().getId());
          runnable.run();
          sleep(3000);
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  private Worker[] workers;

  public MyThreadPool() {
    maxThreadNum = DEFAULT_THREAD_NUM;
    queue = new LinkedBlockingQueue<>();

    initWorkers();
  }

  public MyThreadPool(int maxThreadNum, BlockingQueue<Runnable> queue) {
    this.maxThreadNum = maxThreadNum;
    this.queue = queue;

    initWorkers();
  }

  void initWorkers() {
    workers = new Worker[maxThreadNum];
    for (int i = 0; i < maxThreadNum; i++) {
      workers[i] = new Worker();
      workers[i].start();
    }
  }

  void execute(Runnable runnable) {
    try {
      queue.put(runnable);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    MyThreadPool myThreadPool = new MyThreadPool(3, new LinkedBlockingQueue<>(5));
    Runnable runnable = () -> {};
    myThreadPool.execute(runnable);
    myThreadPool.execute(runnable);
    myThreadPool.execute(runnable);
    myThreadPool.execute(runnable);
    myThreadPool.execute(runnable);
    myThreadPool.execute(runnable);
    myThreadPool.execute(runnable);
    myThreadPool.execute(runnable);
    myThreadPool.execute(runnable);
  }
}
           

带返回值

public class MyThreadPool2 {

  private static final int DEFAULT_THREAD_NUM = 10;

  private int maxThreadNum;
  private BlockingQueue<FutureTask> queue;

  // 原理同上
  // 采用FutureTask对象的run方法运行
  private class Worker extends Thread {
    @Override
    public void run() {
      try {
        for (; ; ) {
          FutureTask futureTask = queue.take();
          System.out.println(currentThread().getId());
          sleep(3000);
          futureTask.run();
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  private Worker[] workers;

  public MyThreadPool2() {
    this.maxThreadNum = DEFAULT_THREAD_NUM;
    this.queue = new LinkedBlockingQueue<>();

    initWorkers();
  }

  public MyThreadPool2(int maxThreadNum, BlockingQueue<FutureTask> queue) {
    this.maxThreadNum = maxThreadNum;
    this.queue = queue;

    initWorkers();
  }

  void initWorkers() {
    workers = new Worker[maxThreadNum];
    for (int i = 0; i < maxThreadNum; i++) {
      workers[i] = new Worker();
      workers[i].start();
    }
  }

  // 将runnable封装为FutureTask对象,null表示返回值result
  void execute(Runnable runnable) {
    try {
      queue.put(new FutureTask(runnable, null));
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  // 将Callable对象封装为FutureTask对象
  <E> FutureTask<E> submit(Callable<E> callable) {
    FutureTask<E> futureTask = new FutureTask(callable);
    try {
      queue.put(futureTask);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return futureTask;
  }

  public static void main(String[] args) {
    MyThreadPool2 myThreadPool2 = new MyThreadPool2(3, new LinkedBlockingQueue<>(5));

    Runnable runnable = () -> {
    };
    myThreadPool2.execute(runnable);
    myThreadPool2.execute(runnable);
    myThreadPool2.execute(runnable);
    myThreadPool2.execute(runnable);
    myThreadPool2.execute(runnable);
    myThreadPool2.execute(runnable);

    Callable<Integer> callable = new Callable() {
      int n = 10;

      @Override
      public Integer call() throws Exception {
        return n--;
      }
    };
    FutureTask<Integer> futureTask1 = myThreadPool2.submit(callable);
    FutureTask<Integer> futureTask2 = myThreadPool2.submit(callable);
    FutureTask<Integer> futureTask3 = myThreadPool2.submit(callable);
    try {
      System.out.println(futureTask1.get());
      System.out.println(futureTask2.get());
      System.out.println(futureTask3.get());

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}