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

本文介绍了Java中线程控制的join方法与ThreadLocal类的使用。join方法用于主线程等待子线程执行完成;ThreadLocal类实现每个线程拥有独立的变量副本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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()方法,两个线程具有不同的初始值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值