织梦CMS - 轻松建站从此开始!

亿万先生-亿万先生mr007-亿万先生老虎机

当前位置: 主页 > mr007亿万先生 >

java多线程join的使用?

时间:2017-08-13 10:03来源:未知 作者:admin 点击:
这段代码是用于验证join方法的使用, 一个线程通过join方法等待另一个线程的执行结束, 按照我的理解, 应该是a和b有序输出, 且主线程一定在b输出之后输出. 但是实际运行结果并不是这样

这段代码是用于验证join方法的使用, 一个线程通过join方法等待另一个线程的执行结束, 按照我的理解, 应该是a和b有序输出, 且主线程一定在b输出之后输出. 但是实际运行结果并不是这样的. 实际的输出如下:

书上讲不光会出现这种情况, 还有可能出现:

threadA sleep start , end
threadB sleep start
main end
threadB sleep end

对于这两种情况该怎么解释呢?
代码如下:

public class Main
{
    public static void main(String[] args)throws Exception
    {
        try {
            ThreadB  b = new ThreadB() ;
            ThreadA a = new ThreadA(b) ;
            a.start();
            b.start();
            b.join(2000) ;//似乎问题的关键就是这一行, 但是我无法解释为什么
            System.out.println("main end");
            Thread.sleep(1);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

class ThreadA extends Thread
{
    private ThreadB b ;

    public ThreadA(ThreadB b) {
        this.b = b;
    }

    @Override
    public void run() {
        try {
            synchronized (b)
            {
                System.out.println("threadA sleep start ....");
                this.sleep(5000) ;
                System.out.println("threadA sleep end....");
            }
        }
        catch (InterruptedException e)
        {
            e.printStackTrace() ;
        }
    }
}


class ThreadB extends Thread
{
    @Override
    public synchronized void run() {
        try {
            System.out.println("threadB sleep start....");
            this.sleep(5000);
            System.out.println("threadB sleep end....");
        }
        catch (InterruptedException e)
        {
            e.printStackTrace() ;
        }

    }
}
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容