关于java阻塞线程的问题

packagehigh;classxiancheng6implementsRunnable{publicvoidrun(){for(inti=0;i<20;i++)Sys... package high;
class xiancheng6 implements Runnable
{
public void run()
{
for(int i=0;i<20;i++)
System.out.println(Thread.currentThread().getName()+"被执行");

}

}
public class Xian_join {
public static void main(String[] args) {

Thread t1=new Thread(new xiancheng6());
Thread t2=new Thread(new xiancheng6());
t1.start();
t2.start();
try {
t1.join();
} catch (InterruptedException e) {

e.printStackTrace();
}

/* for(int i=0;i<10;i++)
{
System.out.println("22222222222");

}*/

}
}

这段代码中为什么t1并没有阻塞t2?
展开
 我来答
土憨宝
推荐于2016-06-09 · TA获得超过368个赞
知道小有建树答主
回答量:203
采纳率:100%
帮助的人:215万
展开全部
首先,说下join方法,join方法的作用是,让当前线程等待当前调用join方法的线程执行完毕后,然后再继续执行,这个不太好理解,简单点说,你执行t1.join,那么就是阻塞当前线程,让t1先执行。好,再来说楼主的问题:
楼主调用t1.join()的并不是t2线程而是main函数的主线程,所以他并不会阻塞t2,而是会阻塞main方法,如果楼主把最后的for循环打开,你会发现,输出“22222222”肯定是在t1执行完之后。如果想阻塞t2,你的代码还要大改下:(我没有调试,你自己改下,思想肯定是对的)
class xiancheng6 implements Runnable
{
private Thread thread;
public xiancheng6(Thread thread){
this.thread = thread;
}
public void run()
{
for(int i=0;i<20;i++)
{
if (i == 3 && thread != null)
{
try
{
thread.join();
}
catch (InterruptedException e)
{
}
}
System.out.println(Thread.currentThread().getName()+"被执行");
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
}

}

}
public class ThreadTester {
public static void main(String[] args) {

Thread t1=new Thread(new xiancheng6(null));
Thread t2=new Thread(new xiancheng6(t1));
t1.start();
t2.start();
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式