您的位置:首页 > 编程语言

《多线程编程》学习之八:方法join()的使用、类ThreadLocal的使用

2016-11-03 13:58 183 查看
一、join()方法的使用

        一般主线程用于创建与启动子线程,如果子线程的run()方法耗时比较长,主线程常先于子线程结束。如果需要主线程等待子线程执行完毕后再结束,就要用到join()方法。

1.1)子线程运行时间不确定,主线程中没法用sleep(?)方法去等待它执行完毕。



1.2)使用join()方法解决:



        join()方法使当前线程阻塞,直至join()所属的线程对象的run()方法执行完毕才继续往下执行。

1.3)join()方法与异常

        join()方法内部使用的是wait()方法进行等待,如果当前线程对象被中断,则当前线程对象出现异常。







        如果join()方法与interrupt()方法彼此相遇。本例中threadB出现异常。

1.4)join(long)的使用



         运行结果是等待了2s。将main()方法中的代码改为Thread.sleep(2000),发现运行结果是一样的。那么join(2000)与sleep(2000)究竟有何区别?

1.5)join(long)与sleep(long)的区别

        join(long)方法内部使用wait(long)方法实现,具有释放锁的特点,而Thread.sleep(long)方法不释放锁。









        这里由于线程threadB调用Thread.sleep(6000)方法,在6s内一直持有threadA对象锁,所以线程threadC只有在6s后才能获得threadA的锁,从而调用threadA中的同步方法。

       如果将Thread.sleep(6000)改为threadA.join(6000),则运行结果如下:



        线程threadB调用threadA.join(6000),此方法会释放threadA对象锁,所以线程threadC可以调用threadA中的同步方法aService();

二、ThreadLocal类的使用

        可以使用public static 实现变量的共享,所有的线程都是用同一个public static 变量。如要实现每个线程都有自己的共享变量的值,则可以使用ThreadLocal类。

1)get()方法和set()方法



         可见第一次调用test.get()时返回的是null。下面验证线程之间变量的隔离性:

2)线程之间变量的隔离性







          可见,两个线程都向test对象set()数据,但每个线程都可以取出自己的数据。

3)重写ThreadLocal类的initialValue()方法,使第一次调用get()方法时不再返回null。





         每个线程第一次调用ThreadLocal类的get()都会调用initialValue()方法,这里重写了initialValue()方法,两个线程具有不同的初始值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: