《多线程编程》学习之八:方法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()方法,两个线程具有不同的初始值。
一般主线程用于创建与启动子线程,如果子线程的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()方法,两个线程具有不同的初始值。
相关文章推荐
- 多线程学习-方法join的使用
- Join() 方法 & ThreadLocal 类的使用
- 线程入门学习4------join方法的使用
- java多线程学习之使用join()方法实现线程插队
- shell中join命令的一些使用方法
- 详细讲解学习ASP Server对象使用方法
- SQL数据库使用JOIN的优化方法(转)
- SQL数据库使用JOIN的优化方法
- Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)(转载)
- Ext JS 学习(1) Ext.MessageBox.show()方法的使用
- java:log4j学习(5)-转帖:Log4j基本使用方法
- [ASP.NET学习笔记之四]数据集的使用方法和技巧
- ASP.NET AJAX 以及AJAXPRO使用客户端调用服务器端的方法--初学者学习
- 转:一个学习案例: 使用 IBM Rational Unified Process 作为方法框架
- 新学习到的GridView使用方法
- [学习笔记]java web ServletContext.getRealPath(String str)方法的使用
- [ASP.NET学习笔记之四]数据集的使用方法和技巧
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- SQL数据库使用JOIN的优化方法
- 学习CSS中background-position的使用方法