欢迎大家来到IT世界,在知识的湖畔探索吧!
一、实现多线程的几种方式?
1.继承Tread类 JDK1.5之前 实现run()方法
2.实现接口Runable接口 JDK1.5之前 实现run()方法
3.实现接口Callable接口 JDK1.5 实现call()并且会返回FurtureTask对象
FurtureTask对象底层也是实现了Runable的接口和重写了run()方法,会把call()的返回值设置到furtureTask对象里面,并且可以通过get方法获取返回值。
二、线程池的生命周期
线程的6种状态分析
扩展知识点:
yield()方法:暂停当前正在执行的线程对象,并执行其他线程。
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
jion()方法:线程实例的join()方法可以使得一个线程在另一个线程结束后再执行,即也就是说使得当前线程可以阻塞其他线程执行;
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。
比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
三、线程池的优点
线程池的执行效率是普通的线程执行的百倍
具体的优点:
四、线程池的源码分析
java.util.concurrent.Executor是线程池的最上级的类 第一层
java.util.concurrent.ExecutorService 提交接口 submit接口 第二层
java.util.concurrent.AbstractExecutorService 把执行和提交的接口进行整合重写了ExecutorService中的submit方法 第三层
java.util.concurrent.ThreadPoolExecutor 普通线程池的方法 第四层
线程池复用的原理:
线程池底层实现原理:
扩展知识点:
submit和execute区别?
1.submit是有返回值的 execute是没有返回值的
2.submit会自动捕获异常,没有发生异常时通过返回的Future的get方法是正常的返回值,如果是发生异常的话是会返回异常的信息 execute出现异常时需要自己手动捕获异常。
所以在我们平常情况下,使用Future的时候并不多,因为它会阻塞我们的请求。所以 想要抛出异常,还是使用execute方便一些。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/38303.html