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