<强> JAVA多线程加入强>
,对于Java开发人员,多线程应该是必须熟练应用的知识点,特别是开发基于Java语言的产品。本文将深入浅出的表述Java多线程的知识点,在后续的系列里将侧重于Java5由Doug Lea教授提供的并发并行包的设计思想以及具体实现与应用。
,,,如何才能深入浅出呢,我的理解是带着问题,而不是泛泛的看,所以该系列基本以解决问题为主,当然我也非常希望读者能够提出更好的解决问题的方案以及提出更多的问题。由于水平有限,如果有什么错误之处,请大家提出,共同讨论,总之,我希望通过该系列我们能够深入理解Java多线程来解决我们实际开发的问题。
,,,作为开发人员,我想没有必要讨论多线程的基础知识,比如什么是线程?如何创建等,这些知识点是可以通过书本和谷歌获得的。本系列主要是如何理深入解多线程来帮助我们平时的开发,比如线程池如何实现?如何应用锁等只
(1)方法加入是干啥用的?简单回答,同步,如何同步?怎么实现的?下面将逐个回答。
,,自从接触Java多线程,一直对加入理解不了.JDK是这样说的:
加入 公众最终无效加入(长,米尔斯)抛出InterruptedException 最多,米尔斯毫秒等待此线程死。永远等待超时(0)手段。 >之前,大家能理解吗?字面意思是等待一段时间直到这个线程死亡,我的疑问是那个线程,是它本身的线程还是调用它的线程的,上代码:
包concurrentstudy;/* * * * @author vma */公共类联合{ 公共静态void main (String [] args) { 线程t=新线程(新RunnableImpl ()); t.start (); 尝试{ t.join (1000); System.out.println (“joinFinish”); }捕捉(InterruptedException e) {//TODO自动生成的catch块 e.printStackTrace (); } } } 类RunnableImpl实现Runnable { @Override 公共空间run () { 尝试{ system . out。println(“开始睡眠”); thread . sleep (1000); system . out。println(“睡眠”); }捕捉(InterruptedException e) { e.printStackTrace (); } } } >之前结果是:
开始睡觉 最后睡觉 joinFinish >之前明白了吧,当主要线程调用t。加入时,主要线程等待t线程,等待时间是1000年,如果t线程睡眠2000呢,
公共空间run () { 尝试{ system . out。println(“开始睡眠”);//thread . sleep (1000); thread . sleep (2000); system . out。println(“睡眠”); }捕捉(InterruptedException e) { e.printStackTrace (); } } >之前结果是:
开始睡觉 joinFinish 最后睡觉 >之前也就是说主要线程只等1000毫秒,不管T什么时候结束,如果是t.join()呢,看代码:,,
公众最终无效加入()抛出InterruptedException { 加入(0); } >之前就是说如果是t.join ()=t.join (0) 0 JDK这样说的超时为0意味着永远等待字面意思是永远等待,是这样吗?
其实是等到t结束后。
这个是怎么实现的吗?看JDK代码:
/* * *最多等待& lt; code> millis</code>为这个线程毫秒 *死。一个超时& lt; code> 0 & lt;/code>永远等待。 * * @param米尔斯等以毫秒为单位的时间。 * @exception InterruptedException如果任何线程中断 *当前线程。& lt; i>打断status的 *当前线程清除当这个异常。 */公众最终同步空白加入(长,米尔斯) 抛出InterruptedException { 长基=System.currentTimeMillis (); 现在长=0; 如果米尔斯& lt;0){ 把新IllegalArgumentException(“超时值是负”); } 如果米尔斯==0){ 而(isAlive ()) { 等待(0); } 其他}{ 而(isAlive ()) { 长时间的推迟=从而现在; 如果(延迟& lt;=0) { 打破; } 等待(延迟); 现在=System.currentTimeMillis()——基础; } } } >之前JAVA多线程之方法加入详解及实例代码