1、简述

线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能称为一个整体。

使线程之间进行通信后,在大大提高CPU利用率的同时还会使开发人员对各个线程任务在处理的过程中进行有效的把控。

2、如何实现线程间通信

2.1、等待(wait)/通知机制(notify)

方法 wait() 说明

方法wait()的作用是使当前执行的线程进行等待,wait() 方法是Object 类的方法,该方法用来将当前线程处于预执行状态,并且在调用wait()方法的代码处停止执行,直到接到通知或被终止。

在调用wait()之前,线程必须获得对象的锁,即只能在同步方法或代码块中调用wait()方法。在执行wait()方法后,当前线程释放锁。

如果 调用 wait() 时 没有持有适当的锁,则抛出IllegalMonitorStateException, 它是 RuntimeException 的 一个 子类。

方法 notify()说明

notify()方法在调用前,线程也必须获得该对象的锁,否则会抛出 IllegalMonitorStateException。该方法用来通知哪些等待该对象锁的其它线程,如果有多个线程等待,则有线程规划器随机挑选一个 wait 中的线程,对其发出notify 通知并使它准备回去该对象的锁。

在执行notify() 方法后,当前线程不会马上释放对象锁,要等待执行notify() 方法的线程执行完毕后,当前线程才会真正释放锁。

等待/通知机制总结:

wait()方法可以使调用该方法的线程释放共享资源的锁,然后从运行状态退出, 进入 等待队列,直到被再次唤醒。

notify() 方法可以随机唤醒一个等待队列中的线程,并使该线程退出等待队列, 进入 可运行状态,也就是 notify()方法仅通知“ 一个” 线程。

notifyAll()方法可以使所有正在等待队列中的全部线程 从等待状态退出, 进入可运行状态。 此时,优先级最高的那个线程最先执行,但也有可能随机执行, 因为 这要取决于JVM虚拟机的实现。

2.2、使用方法join

在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量耗时运算,主线程往往早于子线程结束之前结束。这时如果主线程想等待子线程完成之后再结束,比如子线程处理一个数据,主线程要取得子线程的结果进行计算,就要用到join()方法了。

1、join()方法与 synchronized 的区别是:

join()方法内部使用 wait()方法进行等待,而synchrinized 关键字使用的是对象监视器原理实现同步。

2、join()方法与sleep()方法的区别:

join()方法内部是使用wait()方法来实现,所以join()方法具有释放锁的特点,而sleep()方法只是释放了CPU资源,但是不释放锁。

2.3、使用ThreadLocal

变量值得共享可以使用 publict static 变量的形式,所有的线程都使用同一个变量。如果每一个线程都有自己的共享变量该如何解决呢?JDK中提供了ThreadLocal 正式为了解决这样的问题。类 ThreadLocal 主要解决的是每个线程都可以拥有自己线程内的共享变量。

ThreadLocal 主要解决的是线程之间的隔离性,每个线程都有自己独有的值,互不干扰,同时该特性在父子关系的线程中也有效。

2.4、使用InheritableThreadLocal

使用类InheritableThreadLocal 可以在子线程中取得父线程继承下来的值。

但在使用类InheritableThreadLocal 时需要注意一点,如果子线程在取得值得同时,主线程将其中的值进行了修改,那么子线程取到的值还是旧值。

Java线程间如何通信(五)的更多相关文章

  1. java 线程间的通信 (wait / notify / notifyAll)

    package waitnotifytest; import java.util.Collections; import java.util.List; import com.google.commo ...

  2. Java线程间通信-回调的实现方式

    Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互.   比如举一个简单例子,有一个多线程的 ...

  3. 说说Java线程间通信

    序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...

  4. 说说 Java 线程间通信

    序言 正文 一.Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个 ...

  5. Java多线程之线程的状态以及线程间协作通信导致的线程状态转换

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html  一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...

  6. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  7. Java多线程中线程间的通信

    一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.u ...

  8. Java 多线程(七) 线程间的通信——wait及notify方法

    线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...

  9. 【转】Java学习---线程间的通信

    [原文]https://www.toutiao.com/i6572378564534993415/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...

随机推荐

  1. 1-MySQL DBA笔记-理解MySQL

    第一部分 入门篇 本篇首先介绍MySQL的应用领域.基础架构和版本,然后介绍MySQL的基础知识,如查询的执行过程.权限机制.连接.存储引擎,最后阐述一些基础概念. 第1章 理解MySQL 本章将介绍 ...

  2. LINQ 多条件join on

    var  tmp = from a in DT1.AsEnumerable() join b in DT2.AsEnumerable() on new { bm = a.Field<string ...

  3. mysql 8.0.13开启远程连接 配置方式

    1:linux登录mysql [root@localhost mysql]# mysql -u root -p Enter password: Welcome to the MySQL monitor ...

  4. 基于Windows服务的聊天程序

    本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负 ...

  5. 集合源码阅读——ArrayList

    ArrayList 关键点: >>扩容每次扩容1.5倍 >>modcount的作用 >>ArrayList的父类AbstractList的成员变量 >> ...

  6. asp.net 简单的身份验证

    1 通常我们希望已经通过身份验证的才能够登录到网站的后台管理界面,对于asp.net 介绍一种简单的身份验证方式 首先在webconfig文件中添加如下的代码 <!--身份验证--> &l ...

  7. K2 BPM_曾经我也是996的一员_全球领先的工作流引擎

    最近关于996的工作模式掀起了新一波讨论热潮.事情源于有人在知名代码托管平台GitHub上,发起了一个名为“996.ICU”的项目,意为“工作996,生病ICU”,以抵制互联网公司的996工作制,项目 ...

  8. mysql in 中使用子查询,会不使用索引而走全表扫描

    所以可以将 in 条件中 子查询转换成一张子表,从而通过 join 的形式进行条件限制.

  9. python多继承下的查找顺序-MRO原则演变与C3算法

    在python历史版本中的演变史 python2.2之前: MRO原则: 只有经典类,遵循深度优先(从左到右)原则, 存在的问题:在有重叠的多继承中,违背重写可用原则 解决办法是再设计类的时候不要设计 ...

  10. 将windows当做linux/Mac来用 scoop强大的包管理工具

    在Linux中有apt-get.yum这些包安装管理 安装相当方便:如ubuntu安装一个mysql5.7,只需要一个简单的命令: apt-get 而在windows中需要在MySQL官网下载对应版本 ...