java线程池newFixedThreadPool详解
来源:互联网 发布:北大外国语学院知乎 编辑:程序博客网 时间:2024/04/29 11:45
java线程池Executors.newFixedThreadPool(int nThread)很多人都用过,但可能不一定看过里面的实现,这几天刚好去面试,这个东西基本也就是个必问题了,这下顺便整理一下,至于面试的结果,先就按下不表了。使用方法
ExecutorService service = Executors.newFixedThreadPool(3);for (int i = 0 ; i < 4 ;i ++) { int j = i; service.execute(new Runnable() { @Override public void run() { try { Thread.sleep(10000); System.out.println("test" + j); } catch (Exception e) { } } }); }
newFixedThreadPool(int nThread)必须指定线程池的大小,线程池没有默认值,而newCachedThreadPool()是不需要设置线程池大小,默认就是Integer.MAX。
newFixedThreadPool()用的是LinkedBlockingQueue,但由于newFixedThreadPool()是必须设置线程池大小的,所以LinkedBlockingQueue是有界的。
其实newFixedThreadPool()在严格上说并不会复用线程,每运行一个Runnable都会通过ThreadFactory创建一个线程。
ThreadPoolExecutor.execute(Runnable command)
int c = ctl.get(); if (workerCountOf(c) < corePoolSize) { if (addWorker(command, true)) return; c = ctl.get(); }
如果运行中的线程小于线程池大小,就直接创建进程执行。
if (isRunning(c) && workQueue.offer(command)) { int recheck = ctl.get(); if (! isRunning(recheck) && remove(command)) reject(command); else if (workerCountOf(recheck) == 0) addWorker(null, false); } else if (!addWorker(command, false)) reject(command);
如果正在执行中的线程大于线程池的大小,就会执行上述代码,把Runnable放入wokrQueuue,就是LinkBlockingQueue。
ThreadPoolExecutor.getTask()
try { Runnable r = timed ? workQueue.poll(keepAliveTime,TimeUnit.NANOSECONDS) :workQueue.take(); if (r != null) return r; timedOut = true; } catch (InterruptedException retry) { timedOut = false; }
取出Runnable,执行线程。
以后会再谈一下Woker的使用。
0 0
- java线程池newFixedThreadPool详解
- Java newFixedThreadPool线程池实例及讲解
- Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool
- java最实用newFixedThreadPool线程池
- java线程池(二) Executors.newFixedThreadPool
- 线程池Executors.newFixedThreadPool
- 线程池Executors.newFixedThreadPool
- 线程池Executors.newFixedThreadPool
- newFixedThreadPool线程池
- java线程池(newFixedThreadPool)线程消失疑问?
- Java 自带的线程池Executors.newFixedThreadPool
- Java 自带的线程池Executors.newFixedThreadPool
- Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
- Java线程池(newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool 、newSingleThreadExector )
- JAVA线程池 newSingleThreadExecutor,newFixedThreadPool,newCachedThreadPool,newScheduledThreadPool(一)
- Java自带的线程池Executors.newFixedThreadPool
- Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
- 浅谈Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
- 欢迎使用CSDN-markdown编辑器
- 迁移Zabbix数据库到TokuDB
- Valid Palindrome
- OpenCV实践之路——用dlib库进行人脸检测与人脸标记(Python)
- AS 60L flammable storage cabinet for material handling equipment
- java线程池newFixedThreadPool详解
- eclipse如何终止对Android项目的调试
- 【静下心学习Unity】学习笔记 (二)Unity基础知识点
- 强引用、软引用、弱引用、虚引用的概念以及如何避免OOM错误
- C++实验3-个人所得税计算器
- 二叉树的基本操作(非递归前中后遍历,先序,表达式建树,复制二叉树)
- 利用qrcode生成二维码
- nginx忽略favicon.ico日志
- UIAlertController 用法简介