三. 线程间通信知识点补充

线程通信知识补充
1. 管道输入/输出流
- 管道输入/输出流主要用于线程之间的数据传输,而且传输的媒介为内存。
- 管道输入/输出流主要包括下列两类的实现:
- 面向字节: PipedOutputStream、 PipedInputStream
- 面向字符: PipedWriter、 PipedReader
2. Thread.join()的使用
- 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。另外,一个线程需要等待另一个线程也需要用到join()方法。
- Thread类除了提供join()方法之外,还提供了join(long millis)、join(long millis, int nanos)两个具有超时特性的方法。这两个超时方法表示,如果线程thread在指定的超时时间没有终止,那么将会从该超时方法中返回。
- Thread.sleep(2000)不会释放锁,threadTest.join(2000)会释放锁 。
3. ThreadLocal的使用
3.1 ThreadLocal介绍
- 变量值的共享可以使用public static变量的形式,所有线程都使用一个public static变量。如果想实现每一个线程都有自己的共享变量该如何解决呢?
- JDK中提供的ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。
3.2 ThreadLocal方法
| 方法名称 | 描述 |
|---|
| get() | 返回当前线程的此线程局部变量的副本中的值。 |
| set(T value) | 将当前线程的此线程局部变量的副本设置为指定的值 |
| remove() | 删除此线程局部变量的当前线程的值 |
| initialValue() | 返回此线程局部变量的当前线程的"初始值" |
3.3 InheritableThreadLocal
- ThreadLocal类固然很好,但是子线程并不能取到父线程的ThreadLocal类的变量,InheritableThreadLocal类就是解决这个问题的。
- 在使用InheritableThreadLocal类需要注意的一点是:如果子线程在取得值的同时,主线程将InheritableThreadLocal中的值进行更改,那么子线程取到的还是旧值。
%5Btoc%5D%0A%23%23%20%E4%B8%89.%20%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E7%9F%A5%E8%AF%86%E7%82%B9%E8%A1%A5%E5%85%85%0A!%5Bhttps://cdn-images.postach.io/5193531f-2650-40fd-90d9-0c7df1b66f2d/fe2f0d8b-bb19-4773-af47-1fbc0d05ec7f/158dda0d-935a-42c1-893d-6c3ae0271c4f.jpg.jpeg%5D(en-resource%3A%2F%2Fdatabase%2F610%3A1)%0A%5B%E7%BA%BF%E7%A8%8B%E9%80%9A%E4%BF%A1%E7%9F%A5%E8%AF%86%E8%A1%A5%E5%85%85%5D(https%3A%2F%2Fblog.csdn.net%2Fqq_34337272%2Farticle%2Fdetails%2F79694226)%0A%23%23%23%201.%20%E7%AE%A1%E9%81%93%E8%BE%93%E5%85%A5%2F%E8%BE%93%E5%87%BA%E6%B5%81%0A*%20%E7%AE%A1%E9%81%93%E8%BE%93%E5%85%A5%2F%E8%BE%93%E5%87%BA%E6%B5%81%E4%B8%BB%E8%A6%81%E7%94%A8%E4%BA%8E%E7%BA%BF%E7%A8%8B%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93%EF%BC%8C%E8%80%8C%E4%B8%94%E4%BC%A0%E8%BE%93%E7%9A%84%E5%AA%92%E4%BB%8B%E4%B8%BA%E5%86%85%E5%AD%98%E3%80%82%0A*%20%E7%AE%A1%E9%81%93%E8%BE%93%E5%85%A5%2F%E8%BE%93%E5%87%BA%E6%B5%81%E4%B8%BB%E8%A6%81%E5%8C%85%E6%8B%AC%E4%B8%8B%E5%88%97%E4%B8%A4%E7%B1%BB%E7%9A%84%E5%AE%9E%E7%8E%B0%EF%BC%9A%0A%3E1.%20%E9%9D%A2%E5%90%91%E5%AD%97%E8%8A%82%EF%BC%9A%20PipedOutputStream%E3%80%81%20PipedInputStream%0A%3E2.%20%20%E9%9D%A2%E5%90%91%E5%AD%97%E7%AC%A6%3A%20PipedWriter%E3%80%81%20PipedReader%0A%0A%23%23%23%202.%20Thread.join()%E7%9A%84%E4%BD%BF%E7%94%A8%0A*%20%E5%9C%A8%E5%BE%88%E5%A4%9A%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E4%B8%BB%E7%BA%BF%E7%A8%8B%E7%94%9F%E6%88%90%E5%B9%B6%E8%B5%B7%E5%8A%A8%E4%BA%86%E5%AD%90%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%AD%90%E7%BA%BF%E7%A8%8B%E9%87%8C%E8%A6%81%E8%BF%9B%E8%A1%8C%E5%A4%A7%E9%87%8F%E7%9A%84%E8%80%97%E6%97%B6%E7%9A%84%E8%BF%90%E7%AE%97%EF%BC%8C%E4%B8%BB%E7%BA%BF%E7%A8%8B%E5%BE%80%E5%BE%80%E5%B0%86%E4%BA%8E%E5%AD%90%E7%BA%BF%E7%A8%8B%E4%B9%8B%E5%89%8D%E7%BB%93%E6%9D%9F%EF%BC%8C%E4%BD%86%E6%98%AF%E5%A6%82%E6%9E%9C%E4%B8%BB%E7%BA%BF%E7%A8%8B%E5%A4%84%E7%90%86%E5%AE%8C%E5%85%B6%E4%BB%96%E7%9A%84%E4%BA%8B%E5%8A%A1%E5%90%8E%EF%BC%8C%E9%9C%80%E8%A6%81%E7%94%A8%E5%88%B0%E5%AD%90%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%A4%84%E7%90%86%E7%BB%93%E6%9E%9C%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E4%B8%BB%E7%BA%BF%E7%A8%8B%E9%9C%80%E8%A6%81%E7%AD%89%E5%BE%85%E5%AD%90%E7%BA%BF%E7%A8%8B%E6%89%A7%E8%A1%8C%E5%AE%8C%E6%88%90%E4%B9%8B%E5%90%8E%E5%86%8D%E7%BB%93%E6%9D%9F%EF%BC%8C%E8%BF%99%E4%B8%AA%E6%97%B6%E5%80%99%E5%B0%B1%E8%A6%81%E7%94%A8%E5%88%B0join()%E6%96%B9%E6%B3%95%E4%BA%86%E3%80%82%E5%8F%A6%E5%A4%96%EF%BC%8C%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E9%9C%80%E8%A6%81%E7%AD%89%E5%BE%85%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%B9%9F%E9%9C%80%E8%A6%81%E7%94%A8%E5%88%B0join()%E6%96%B9%E6%B3%95%E3%80%82%0A*%20Thread%E7%B1%BB%E9%99%A4%E4%BA%86%E6%8F%90%E4%BE%9Bjoin()%E6%96%B9%E6%B3%95%E4%B9%8B%E5%A4%96%EF%BC%8C%E8%BF%98%E6%8F%90%E4%BE%9B%E4%BA%86join(long%20millis)%E3%80%81join(long%20millis%2C%20int%20nanos)%E4%B8%A4%E4%B8%AA%E5%85%B7%E6%9C%89%E8%B6%85%E6%97%B6%E7%89%B9%E6%80%A7%E7%9A%84%E6%96%B9%E6%B3%95%E3%80%82%E8%BF%99%E4%B8%A4%E4%B8%AA%E8%B6%85%E6%97%B6%E6%96%B9%E6%B3%95%E8%A1%A8%E7%A4%BA%EF%BC%8C%E5%A6%82%E6%9E%9C%E7%BA%BF%E7%A8%8Bthread%E5%9C%A8%E6%8C%87%E5%AE%9A%E7%9A%84%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4%E6%B2%A1%E6%9C%89%E7%BB%88%E6%AD%A2%EF%BC%8C%E9%82%A3%E4%B9%88%E5%B0%86%E4%BC%9A%E4%BB%8E%E8%AF%A5%E8%B6%85%E6%97%B6%E6%96%B9%E6%B3%95%E4%B8%AD%E8%BF%94%E5%9B%9E%E3%80%82%0A*%20%C2%A0Thread.sleep(2000)%E4%B8%8D%E4%BC%9A%E9%87%8A%E6%94%BE%E9%94%81%EF%BC%8CthreadTest.join(2000)%E4%BC%9A%E9%87%8A%E6%94%BE%E9%94%81%C2%A0%E3%80%82%0A%0A%23%23%23%203.%20%C2%A0ThreadLocal%E7%9A%84%E4%BD%BF%E7%94%A8%0A%23%23%23%23%203.1%20ThreadLocal%E4%BB%8B%E7%BB%8D%0A*%20%E5%8F%98%E9%87%8F%E5%80%BC%E7%9A%84%E5%85%B1%E4%BA%AB%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8public%20static%E5%8F%98%E9%87%8F%E7%9A%84%E5%BD%A2%E5%BC%8F%EF%BC%8C%E6%89%80%E6%9C%89%E7%BA%BF%E7%A8%8B%E9%83%BD%E4%BD%BF%E7%94%A8%E4%B8%80%E4%B8%AApublic%20static%E5%8F%98%E9%87%8F%E3%80%82%E5%A6%82%E6%9E%9C%E6%83%B3%E5%AE%9E%E7%8E%B0**%E6%AF%8F%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E9%83%BD%E6%9C%89%E8%87%AA%E5%B7%B1%E7%9A%84%E5%85%B1%E4%BA%AB%E5%8F%98%E9%87%8F**%E8%AF%A5%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%91%A2%EF%BC%9F%0A*%20JDK%E4%B8%AD%E6%8F%90%E4%BE%9B%E7%9A%84ThreadLocal%E7%B1%BB%E6%AD%A3%E6%98%AF%E4%B8%BA%E4%BA%86%E8%A7%A3%E5%86%B3%E8%BF%99%E6%A0%B7%E7%9A%84%E9%97%AE%E9%A2%98%E3%80%82ThreadLocal%E7%B1%BB%E4%B8%BB%E8%A6%81%E8%A7%A3%E5%86%B3%E7%9A%84%E5%B0%B1%E6%98%AF%E8%AE%A9**%E6%AF%8F%E4%B8%AA%E7%BA%BF%E7%A8%8B%E7%BB%91%E5%AE%9A%E8%87%AA%E5%B7%B1%E7%9A%84%E5%80%BC**%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%B0%86ThreadLocal%E7%B1%BB%E5%BD%A2%E8%B1%A1%E7%9A%84%E6%AF%94%E5%96%BB%E6%88%90%E5%AD%98%E6%94%BE%E6%95%B0%E6%8D%AE%E7%9A%84%E7%9B%92%E5%AD%90%EF%BC%8C%E7%9B%92%E5%AD%90%E4%B8%AD%E5%8F%AF%E4%BB%A5%E5%AD%98%E5%82%A8%E6%AF%8F%E4%B8%AA%E7%BA%BF%E7%A8%8B%E7%9A%84%E7%A7%81%E6%9C%89%E6%95%B0%E6%8D%AE%E3%80%82%0A%0A%23%23%23%23%203.2%20ThreadLocal%E6%96%B9%E6%B3%95%0A%0A%7C%20%E6%96%B9%E6%B3%95%E5%90%8D%E7%A7%B0%20%7C%20%E6%8F%8F%E8%BF%B0%20%7C%0A%7C%20---%20%7C%20---%20%7C%0A%7C%20%20get()%7C%E8%BF%94%E5%9B%9E%E5%BD%93%E5%89%8D%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%AD%A4%E7%BA%BF%E7%A8%8B%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E7%9A%84%E5%89%AF%E6%9C%AC%E4%B8%AD%E7%9A%84%E5%80%BC%E3%80%82%20%20%7C%0A%7Cset(T%20value)%20%20%7C%20%E5%B0%86%E5%BD%93%E5%89%8D%E7%BA%BF%E7%A8%8B%E7%9A%84%E6%AD%A4%E7%BA%BF%E7%A8%8B%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E7%9A%84%E5%89%AF%E6%9C%AC%E8%AE%BE%E7%BD%AE%E4%B8%BA%E6%8C%87%E5%AE%9A%E7%9A%84%E5%80%BC%20%7C%0A%7C%20remove()%20%7C%20%E5%88%A0%E9%99%A4%E6%AD%A4%E7%BA%BF%E7%A8%8B%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E7%9A%84%E5%BD%93%E5%89%8D%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%80%BC%20%7C%0A%7C%20initialValue()%20%7C%E8%BF%94%E5%9B%9E%E6%AD%A4%E7%BA%BF%E7%A8%8B%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E7%9A%84%E5%BD%93%E5%89%8D%E7%BA%BF%E7%A8%8B%E7%9A%84%E2%80%9C%E5%88%9D%E5%A7%8B%E5%80%BC%E2%80%9D%20%20%7C%0A%0A%0A%23%23%23%23%203.3%20%C2%A0InheritableThreadLocal%0A*%20ThreadLocal%E7%B1%BB%E5%9B%BA%E7%84%B6%E5%BE%88%E5%A5%BD%EF%BC%8C%E4%BD%86%E6%98%AF%E5%AD%90%E7%BA%BF%E7%A8%8B%E5%B9%B6%E4%B8%8D%E8%83%BD%E5%8F%96%E5%88%B0%E7%88%B6%E7%BA%BF%E7%A8%8B%E7%9A%84ThreadLocal%E7%B1%BB%E7%9A%84%E5%8F%98%E9%87%8F%EF%BC%8CInheritableThreadLocal%E7%B1%BB%E5%B0%B1%E6%98%AF%E8%A7%A3%E5%86%B3%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%E7%9A%84%E3%80%82%0A*%20%E5%9C%A8%E4%BD%BF%E7%94%A8InheritableThreadLocal%E7%B1%BB%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E4%B8%80%E7%82%B9%E6%98%AF%EF%BC%9A%E5%A6%82%E6%9E%9C%E5%AD%90%E7%BA%BF%E7%A8%8B%E5%9C%A8%E5%8F%96%E5%BE%97%E5%80%BC%E7%9A%84%E5%90%8C%E6%97%B6%EF%BC%8C%E4%B8%BB%E7%BA%BF%E7%A8%8B%E5%B0%86InheritableThreadLocal%E4%B8%AD%E7%9A%84%E5%80%BC%E8%BF%9B%E8%A1%8C%E6%9B%B4%E6%94%B9%EF%BC%8C%E9%82%A3%E4%B9%88%E5%AD%90%E7%BA%BF%E7%A8%8B%E5%8F%96%E5%88%B0%E7%9A%84%E8%BF%98%E6%98%AF%E6%97%A7%E5%80%BC%E3%80%82%0A