黑马程序员技术交流社区

标题: 求助:关于多线程的join方法 [打印本页]

作者: Без_тебя    时间: 2014-6-20 17:03
标题: 求助:关于多线程的join方法
本帖最后由 Без_тебя 于 2014-6-21 10:29 编辑

今天在学多线程的时候,遇到一个问题,我写了一个A类,一个B类,都实现了Runnable接口,然后在C中执行,当i=20的时候,A的多线程使用了join方法,按道理来说,join是让别的线程都暂停,然后知执行自己到结束,但是为什么会输出a...和b....交错,最后才打印c....求助
public class C {
        public static void main(String[] args) throws InterruptedException {
                A a = new A();
                B b = new B();
                Thread t1 = new Thread(a);
                Thread t2 = new Thread(b);
                t1.start();
                t2.start();
               
               
                for(int i=0;i<100;i++){
                        if(i==20){
                                t1.join();
                        }
                        System.out.println("c"+i);
                }
        }
}
class A implements Runnable{
        @Override
        public void run(){
                for(int i=0;i<100;i++){
                        System.out.println("a"+i);
                }
        }
}
class B implements Runnable{
        @Override
        public void run(){
                for(int i=0;i<100;i++){
                        System.out.println("c"+i);
                }
        }
}



作者: 八零、玖羚    时间: 2014-6-20 22:22
貌似你这个(i==20)和前面的i没关系啊,应该把i加上个锁,仅供参考。
作者: lzy418    时间: 2014-6-21 07:38
本帖最后由 lzy418 于 2014-6-21 07:41 编辑

首先提醒一个笔误,Lz的B类里输出的也是c+i。       在我的机子上情况是这样的:


             在c输出到19之前,是a,b,c三者混合输出,读到 join( ); 之后变成了a,b混合,最后从c20开始只输出c。

想必lz是这个情况,所以才看不出问题所在。事实上,lz三个类的输出循环实在是太少了!对于现代计算机的速度来说太少了!
所以,本人将lz的循环增加到了10000,出现了不同的结果:


             在c输出到19之前,是a,b,c三者混合输出,读到 join( ); 之后变成了a,b混合,最后从c20开始b,c混合输出。


是的,加过循环数后我们就能看到b线程始终是活跃的,并没有如同lz期待的那样挂起。
原因是lz对join方法的理解有偏差,join并不能停止所有其他线程,而是只能挂起调用这个方法的线程,在lz的代码中就是main线程,而b根本没有被挂起,自然会继续快乐的抢资源输出。



作者: Без_тебя    时间: 2014-6-21 10:29
lzy418 发表于 2014-6-21 07:38
首先提醒一个笔误,Lz的B类里输出的也是c+i。       在我的机子上情况是这样的:

谢谢~~明白啦~~
作者: hm1314    时间: 2014-6-21 10:49
大牛果然很多。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2