线程池

2020-06-27  本文已影响0人  isLJli

线程池操作过程

线程池会一直存在核心线程,从缓存队列中拿Runnable任务执行。如果加入缓存队列的任务大于缓存队列的容量,则启动非核心线程(最大线程数-核心线程),如果加上非核心线程数执行还是不够,这时就会抛异常。

一个核心线程数4,缓存队列最大128,最大线程数10,60s过时销毁

public class ThreadPoolTest {
  static ThreadPoolExecutor threadPoolExecutor;
  private static final BlockingQueue<Runnable> sPoolWorkQueue =
          new LinkedBlockingQueue<Runnable>(128);

  public void main(String[] args) {
      threadPoolExecutor = new ThreadPoolExecutor(
              4,
              10,
              60,
              TimeUnit.SECONDS,
              sPoolWorkQueue, //缓存队列,任务就加入这里
              new ThreadFactory() { //线程创建工厂 如果线程池需要创建线程,就会调用newThread来创建
                  @Override
                  public Thread newThread(Runnable r) {
                      return new Thread(r);
                  }
              });


      for (int i = 0; i < 20; i++) {
          Runnable runnable = new Runnable() {
              @Override
              public void run() {
                  try {
                      Thread.sleep(1000);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  System.out.println("下载图片完毕" + Thread.currentThread().getName());
              }
          };
          threadPoolExecutor.execute(runnable);
      }

  }
}

BlockingQueue:先进先出队列,最后一个进来的任务先执行
SynchronousQueue : 线程安全的队列,它里面没有固定的缓存数量,Okhttp就使用这种
PriorityQueue : 无序的可以根据优先级排序,比如列表的数据中显示出的列表先请求

上一篇 下一篇

猜你喜欢

热点阅读