Java线程间如何通信(五)
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线程间如何通信(五)的更多相关文章
- java 线程间的通信 (wait / notify / notifyAll)
package waitnotifytest; import java.util.Collections; import java.util.List; import com.google.commo ...
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
- 说说Java线程间通信
序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...
- 说说 Java 线程间通信
序言 正文 一.Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个 ...
- Java多线程之线程的状态以及线程间协作通信导致的线程状态转换
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html 一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...
- java多线程详解(6)-线程间的通信wait及notify方法
Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...
- Java多线程中线程间的通信
一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.u ...
- Java 多线程(七) 线程间的通信——wait及notify方法
线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...
- 【转】Java学习---线程间的通信
[原文]https://www.toutiao.com/i6572378564534993415/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...
随机推荐
- 教你如何进行移动端APP测试
1.安全测试(权限) 1)软件权限:其中包括发送信息,拨打电话,链接网络,访问手机信息,联系人信息等等 2)数据在本地的存储.传输等 3)执行某些操作时导致的输入有效性验证.授权.数据加密等方面 4) ...
- hdu 6053 trick gcd 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意:给定一个数组,我们定义一个新的数组b满足bi<ai 求满足gcd(b1,b2....bn)&g ...
- UVA Tress in a Wood
https://vjudge.net/problem/UVA-10214 题意:给定一个坐标系.|x|<=a, |y|<=b 求坐标系中有多少点是可以从原点直接看到(即从原点和一个点连线, ...
- Spring Boot启动流程分析
引言 早在15年的时候就开始用spring boot进行开发了,然而一直就只是用用,并没有深入去了解spring boot是以什么原理怎样工作的,说来也惭愧.今天让我们从spring boot启动开始 ...
- mysql in 中使用子查询,会不使用索引而走全表扫描
所以可以将 in 条件中 子查询转换成一张子表,从而通过 join 的形式进行条件限制.
- vue项目前端限制页面长时间未操作超时退出到登录页
之前项目超时判断是后台根据token判断的,这样判断需要请求接口才能得到返回结果,这样就出现页面没有接口请求时还可以点击,有接口请求时才会退出 现在需要做到的效果是:页面超过30分钟未操作时,无论点击 ...
- 支持向量机通俗导论 ——理解SVM的三层境界 总结
1.什么是支持向量机(SVM) 所谓支持向量机,顾名思义,分为两部分了解:一,什么是支持向量(简单来说,就是支持或支撑平面上把两类类别划分开来的超平面的向量点):二,这里的“机(machine,机器) ...
- 7.使用EXPLAIN 来分析SQL和表结构_1
explain:查看执行计划 使用explain 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的 分析你的查询语句或是表结构的性能瓶颈 使用explain 可以获 ...
- sudo身份切换
sudo更改身份: 我们知道,使用 su 命令可以让普通用户切换到 root 身份去执行某些特权命令,但存在一些问题,比如说:仅仅为了一个特权操作就直接赋予普通用户控制系统的完整权限: 当多人使用同一 ...
- wlan相关查询命令
1.查看当前连接的设备 hostapd_cli all_sta