concurrent
笔者能力有限,总结有误的地方,请读者协作更正。需要了解更多,请阅读相关书籍。
1.谈一谈Concurrent并发工具包 ? Concurrent并发工具包是java1.5之后出现的,里面提供了很多和并发相关的工具,用于简化多线程开发。
2.什么是BlockingQueue?
线程阻塞式队列,用于一个线程产生产生对象,另一个线程消费对象这种使用场景。
可以用来实现 生产者-消费者机制;
BlockingQueue有两个实现类:
|- ArrayBlockingQueue
实现里BlockingQuery接口,是一个有界的阻塞队列,其内部实现是将对象放到一个数组里。
|- LinkedBlockingQueue
实现里BlockingQuery接口,底层是链表,可以设置容量大小。
3.谈一谈ConcurrentMap? 是一个线程安全的Map, 有一个实现类ConcurrentHashMap; HashMap - 线程不安全 效率高 HashTable - 线程安全 效率低 已经过时 不推荐使用 ConcurrentHashMap - 线程安全 效率比较高
ConcurrentHashMap效率: 锁不是加载整个Map上,而是加在正在操作的桶上的,从而在桶的级别实现了并发 提高效率 引入和读写锁,在并发读的过程中 可以并发 提升效率
4.什么是ExecutorService -- ThreadPool ? 执行器服务、线程池 线程池,用来共享线程,线程在需要的时候创建,用完后不销毁,而是存入线程池,则后续再需要使用线程时,可以直接从池中获取线程来使用,从而减少线程的开关次数,提升程序的性能。 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) corePoolSize 核心池大小 maximumPoolSize 最大池大小 keepAliveTime 空闲的多余线程保持时间 unit 时间单位 workQueue 阻塞式队列 handler 拒绝服务助手
(2)通过工具类获取常用的线程池实现
Executors
newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。
newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池
newSingleThreadExecutor()
创建一个单一线程的线程池
2.执行任务 execute(Runnable) Future submit(Runnable) //可以通过Future的get()方法来观察任务是否执行结束 Future submit(Callable) //可以用来观察任务是否执行结束 并且可以从线程内部带回返回值 invokeAny() invokeAll()
3.关闭线程池
shutdown()
ExecutorService 并不会立即关闭,但它将不再接受新的任务,而且一旦所有线程都完成了当前任务的时候,ExecutorService 将会关闭
shutdownNow()
这样会立即尝试停止所有执行中的任务, 并忽略掉那些已提交但尚未开始处理的任务。 无法担保执行任务的正确执行。可能它们被停止了,也可能已经执行结束。
5.什么是Lock锁? 线程同步的机制 可以实现类似synchronized代码块的效果 但是比synchronized代码更灵活 更简单,两个实现类:
- ReentrantLock
- ReadWriteLock
6.什么是栅栏? 赛马,人到齐了一起跑
7.什么是闭锁? 来一个,条件满足,放行