Java面试知识点之线程篇(三)
前言:这里继续对java线程相关知识点进行总结,不能间断。
1.yield()方法
yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行。注意yield()方法并不会释放锁。
具体:
http://www.cnblogs.com/skywang12345/p/3479243.html
2.join()方法
join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。
参考:
http://www.cnblogs.com/skywang12345/p/3479275.html
3.interrupt()方法
interrupt()方法中断线程。注意这里的中断线程是中断正在阻塞的线程,使其抛出异常。
参考:
http://www.cnblogs.com/skywang12345/p/3479949.html
4.ReentrantLock的使用方法及注意点
注意:ReentrantLock默认为非公平锁,如需设置为公平锁,需要在构造函数中进行设置。
参考:
http://www.cnblogs.com/xrq730/p/4855538.html
5.关于读写锁
读写锁表示两个锁,一个是读操作相关的锁,称为共享锁;另一个是写操作相关的锁,称为排他锁。
参考:
http://www.cnblogs.com/xrq730/p/4855631.html
6.生产者/消费者模型
生产者/消费者模型,在多线程中比较经典,生产者把产品放入中间仓库,消费者从仓库中把产品取出,平衡处理能力。
具体注意该模型中假死问题,单个生产者对多个消费者、多个生产者对单个消费者、多个生产者对多个消费者都可能出现假死。
参考:
http://www.cnblogs.com/xrq730/p/4855663.html
http://www.cnblogs.com/xrq730/p/4855857.html
http://www.cnblogs.com/skywang12345/p/3480016.html
7.线程优先级
Java中线程的优先级默认为5,其优先级范围为1~10,数字越大其优先级越高。“高优先级线程”会优于“低优先级线程”执行,表示获取CPU时间片的机会更大。
参考:
http://www.cnblogs.com/skywang12345/p/3479982.html
https://blog.csdn.net/u013256816/article/details/50392298
8.线程池的五种状态
线程池的状态与线程的状态有所不同,线程池的5种状态是:Running,SHUTDOWN,STOP,TIDYING,TERMINATED。
参考:
http://www.cnblogs.com/skywang12345/p/3509960.html
9.线程池的拒绝策略
线程池一共有四种拒绝策略:
1)AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
2)CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,线程池会将被拒绝的任务添加到"线程池正在运行的线程"中取运行。
3)DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
4)DiscardPolicy -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
参考:
http://www.cnblogs.com/skywang12345/p/3512947.html
10.Semaphore信号量的使用
Semaphore是一个计数信号量,它的本质是一个"共享锁"。
信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。
参考:
http://www.cnblogs.com/skywang12345/p/3534050.html
by Shawn Chen,2018.5.9日,下午。