1.等待/通知机制

wait和notify都是object类的方法。

wait()是线程停止运行,notify()使停止的线程继续运行。

在调用wait和notify时,必须获得对象级锁,因此必须在同步方法或者同步代码块中执行

wait:释放的对象锁-->该锁被其他线程获取,-->获取该锁的线程调用notify并执行完毕释放对象锁-->原来调用wait方法的对象重新获得对象锁-->继续执行

示例代码:

MyThread1.java

package zzzztrhead;public class MyThread1 extends Thread {private Object lock;public MyThread1(Object lock) {super();this.lock = lock;}@Overridepublic void run() {synchronized (lock) {try {System.out.println("开始wait");lock.wait();System.out.println("结束wait");} catch (InterruptedException e) {e.printStackTrace();}}}}
lock.wait();System.out.println("结束wait");} catch (InterruptedException e) {e.printStackTrace();}}}}

MyThread2.java:

package zzzztrhead;public class MyThread2 extends Thread {private Object lock;public MyThread2(Object lock) {super();this.lock = lock;}@Overridepublic void run() {synchronized (lock) {System.out.println("开始notify");lock.notify();System.out.println("结束notify");}}}
lock.notify();System.out.println("结束notify");}}}

Test:

package zzzztrhead;public class WaitNotifyTest {public static void main(String []args) throws InterruptedException{Object lock=new Object();MyThread1 t1=new MyThread1(lock);t1.start();Thread.sleep(3000);//main线程让出cpuMyThread2 t2=new MyThread2(lock);t2.start();}}

执行结果:

开始wait
开始notify
结束notify
结束wait

由执行结果也可以看出:wait释放对象锁,notify不释放,必须等待执行notify的同步方法或代码块执行完才释放

个人理解的:

wait释放的对象锁-->该锁被其他线程获取,-->获取该锁的线程调用notify并执行完毕释放对象锁-->原来调用wait方法的对象重新获得对象锁-->继续执行

2.通过管道进行通信

1.PipedInputStream和PipedOutputStream(字节流)

2.PipedReader和PipedWriter(字符流)

*(outputStream.connect(inputStream);)

3.join方法:

作用:使所属线程对象x正常执行run方法中的任务,使当前线程无线阻塞,等待线程x销毁后再继续执行线程z后面的代码。

在内部使用wait方法进行等待,

源码:

    public final void join() throws InterruptedException {join(0);}
 public final synchronized void join(long millis)throws InterruptedException {long base = System.currentTimeMillis();long now = 0;if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");}if (millis == 0) {while (isAlive()) {wait(0);//使调用join方法的线程等待}} else {while (isAlive()) {long delay = millis - now;if (delay <= 0) {break;}wait(delay);now = System.currentTimeMillis() - base;}}}

还有一点:

  t1.wait();  //  不是使t1线程等待,而是当前执行wait的线程等待 

4.ThreadLocal的使用

每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。

ThreadLocal源码解析:https://www.cnblogs.com/dennyzhangdd/p/7978455.html#_label0_0

操作一个内部类对象ThreadLocalMap,key=当前线程,value=线程局部变量。数据结构以及get,扩容等等类似于hashmap,set解决冲突用的开放定址法。

InheritableThreadLocal可以让子线程从父线程中取得值。(在线程初始化时,将赋值过去,可通过重写childeVlue方法来修改子线程继承自父线程的值)

【Java多线程】(四)线程间通信相关推荐

  1. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  2. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  3. Java多线程:线程间通信之volatile与sychronized

    由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...

  4. java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  5. 【java笔记】线程间通信(2):生产者和消费者案例分析

    [java笔记]线程间通信(1):等待唤醒机制_m0_52043808的博客-CSDN博客 类: 资源类:包子类:皮,馅,有无 生产者: 包子铺类(线程类)(继承Thread) 设置线程任务(run) ...

  6. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

  7. Java进阶知识 - 多线程与线程间通信

    CountdownLatch, CyclicBarrier 分别适合什么场景呢? 大部分情况下, 子线程只需要关心自身执行的任务. 但在某些复杂的情况下, 需要使用多个线程来协同完成某个任务, 这就涉 ...

  8. Java基础学习——多线程(线程间通信-生产者消费者代码示例)

    JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...

  9. 【java笔记】线程间通信(1):等待唤醒机制

    线程间通信概念:多个线程处理同一个资源,但是处理的动作却不相同 必要性:多个线程并发执行时,在默认情况下CPU是随机切换线程的,当需要多个线程来共同完成一件任务,并且希望它们有规律的执行,那么多线程之 ...

  10. 11_C++多线程及线程间通信

    参考: https://m.imooc.com/article/289630   C++11 标准库新引入的线程库 https://www.jianshu.com/p/e5a3498ba930 (一) ...

最新文章

  1. android studio中能用的各种转义字符
  2. tvpvar模型的建模步骤_3D游戏建模入门须知:次世代建模软件有哪些?零基础你都知道吗...
  3. 计算机组成与系统结构+答案书,计算机组成与系统结构书本答案
  4. linux shell 中文件编码查看及转换方法
  5. @bzoj - 2388@ 旅行规划
  6. abap al设置单元格可编辑 oo_excel表格操作: 图形和图表编辑技巧汇总(二)
  7. Linux系统编程26:进程间通信之进程间通信的基本概念
  8. php-5.6.26源代码 - hash存储结构 - hash算法
  9. nginx.conf文件配置及nginx重启脚本
  10. RPM + yum 完美完装tomcat
  11. Carrot2 2.0版中有 Aduna ClusterMap
  12. 2020 wps 免登录_电脑WPS2020永久会员版下载
  13. 时区是怎么划分的?世界各时区的时间如何统一表达?GMT、UTC、UNIX有什么区别?
  14. Statistic 代码统计利器
  15. 桂 林 理 工 大 学实 验 报 告 实验名称实验六 函数
  16. MySQL数据库13——插入数据(INSERT)
  17. 图神经网络基础--图结构数据
  18. 相位干涉仪测向的基础理论
  19. 【罗盘时钟(星空版)---使用html,js,css编写。(附全部源代码+效果)】
  20. css基础--弹性布局

热门文章

  1. 【java基础,IO合集】文件流、高级流(缓冲流、对象流)、 序列化接口java.io.Serrializable
  2. Raft 共识算法3-日志复制
  3. JAVA走上证券行业
  4. 数据结构版学生管理系统
  5. Python——利用协程实现视频的拖影效果
  6. test %eax %eax
  7. MIT6.824 Lab1 MapReduce
  8. ch2_8_2求解幸运数问题
  9. python计算运动会某个参赛选手的得分。数据保存在文件中_为什么一定要考计算机二级证书?8个好处,考和没考区别有点大...
  10. [OGRE]基础教程来三发:来谈一谈摄像机吧