A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Без_тебя 中级黑马   /  2014-6-20 17:03  /  2043 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Без_тебя 于 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);
                }
        }
}


4 个回复

倒序浏览
貌似你这个(i==20)和前面的i没关系啊,应该把i加上个锁,仅供参考。
回复 使用道具 举报
本帖最后由 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根本没有被挂起,自然会继续快乐的抢资源输出。


回复 使用道具 举报 1 0
lzy418 发表于 2014-6-21 07:38
首先提醒一个笔误,Lz的B类里输出的也是c+i。       在我的机子上情况是这样的:

谢谢~~明白啦~~
回复 使用道具 举报
大牛果然很多。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马