了三次。
e. BarrierSample2.java是一个模拟三个运动员参加跑步比赛的例子。其中包含三个运动员和一个裁判。运动员从热身开始起到最后发完奖品离开,中间有几个特定的时间点需要等到所有的人都达到特定的状态,例如,只有当裁判检查完所有运动员以后才开始跑步,所有人跑完以后再进行统计成绩,统计统计完毕统一发奖等。
3. Practise:有一个很大的整数list, 需要求这个list里面的所有整数的和,实现一段充分利用多线程的代码,要求如下:
a. 自行初始化list
b. 求和计算要利用JAVA多线程实现,要求根据一开始输入的线程个数不同可自行调控线程个数
c. 要能输出最后的计算结果,无论是作为返回值,或者直接输出在console上都可以
d. 该list无法一次性load到内存中
AtomicIntergrer, BlockingQueue and Fork/Join
1. for(;;) {} 和 while(true) {} 的相同点和不同点在哪里?
a. 相同点: 两者都是在做死循环
b. 不同点: 前者只对应一条循环语句,后则需要对一个局部变量进行判断,前者执行效率更高
2. Atomic Integer
a. 当没有原子整数的时候,用什么方式可以使得对同一个整型引用的多线程加减修改是线程安全的?--- 加锁
b. 该做法有什么不好的地方? ----- 容易造成死锁
c. Atomic Integer 比 加锁 要快吗? ----- 加锁会快很多,数值计算比较多的地方最好不要使用Atomic Integer,会影响执行效率
d. Atomic Integer适合用在类似分配唯一ID号的地方
3. BlockingQueue
a. Blocking的好处是什么?
可以让线程阻塞,不占用CPU时间,利用阻塞线程等待消息,减少代码复杂度,提高执行效率
b. array, linked的特点分别是什么
i. array内部是用固定大小的数组实现的,初始化时必须给定数组固定大小并初始化话这么大一个数组,效率更高
ii. linked内部用链表实现,初始化时可不给定大小,默认大小为MAX_INT,内存使用上更灵活
c. ReentrantLock, Condition, Atomic Integer (capacity)
i. ReentrantLock 通过lock和unlock方法实现加锁解锁
ii. Condition 类似于Object的wait和notify
iii. Atomic Integer 用于记录队列中元素个数,capacity 队列最大容纳元素个数
d. BlockingQueue最主要的接口
i. Take
ii. put
e. BlockingQueue的应用场景可以有哪些?
f. 谨慎包装BlockingQueue
防止死锁,尽可能通过队列来实现信号的传递
g. queue, deque, priority queue
4. Fork & Join
a. RecursiveTask -> ForkJoinTask -> Future
RecursiveAction -> ForkJoinTask -> Future
ForkJoinPool -> AbstractExecutorService
b. RecursiveTask, RecursiveAction : computer, fork, join
ForkJoinPool : submit
c. 调用
forkJoinPool = new ForkJoinPool();
Future result = forkJoinPool.submit(new RecursiveTask(...)/RecursiveAction(...));
result.get();
d. ForkJoinPool如何实现自适应线程数?
通过调用 System.Runtime中的方法直接获取核数
ConcurrentHashmap, Executor, ThreadPool
1. ConcurrentHashMap
a. 场景
高并发读写,实时性要求很高,IO量大。
b. HashMap为什么不行
写入更新操作涉及到的步骤太多
c. 让步
可以允许读到稍微早一点的过期数据,但是不能读到太久以前的过期数据
还有什么问题不能解决的?
d. 两级结构
Segment, HashEntry
e. 基本操作
i. get, put, remove
ii. size
2. ThreadPool
a. Executor -> ExecutorService -> AbstractExecutorService -> ThreadPoolExecutor
void execute(Runnable command);
b. Executors
c. ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue
workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
threadFactory: ?
d. 停止线程池ThreadPoolExecutor
shutdown()
shutdownNow()
e. 执行
Worker
3. Future and FutureTask
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
运行超时设定取得结果
4. 该线程池使用哪些范围
5. 哪些地方使用该线程池不合适,使用什么样的方式比较合适
<script type="text/java script">
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享!
回本站首页
<script>
function copyToClipBoard(){
var clipBoardContent=document.title + '\r\n' + document.location;
clipBoardContent+='\r\n';
window.clipboardData.setData("Text",clipBoardContent);
alert("恭喜您!复制成功");
}
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732">
<script type="text/