线程池操作过程
线程池会一直存在核心线程,从缓存队列中拿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);
      }
  }
}
- 
最后有线程工厂对象,每次创建线程都会执行其newThread(Runnable r)方法,让我们创建线程去执行任务,这里它不写死,让我们定义线程。
 - 
缓存队列常用有三种:
 
BlockingQueue:先进先出队列,最后一个进来的任务先执行
SynchronousQueue : 线程安全的队列,它里面没有固定的缓存数量,Okhttp就使用这种
PriorityQueue : 无序的可以根据优先级排序,比如列表的数据中显示出的列表先请求











网友评论