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/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...
随机推荐
- c#学习笔记-string stringBuilder
string aTest = "abc";//分配固定的内存大小 aTest += "ddd"; //销毁原先的数据再来分配,消耗大 StringBuilder ...
- 14 SQLAlchemy
一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL ...
- react hooks学习
接触React项目快两个月了,还在研究摸索各种知识点的过程中,充实且幸福. 在项目中学习新知识,还是很有效率的,一边写项目,一边实验新的知识点,比如react hooks!嘻嘻嘻~~~ 写了好一段时间 ...
- 使用jMeter构造大量并发的随机HTTP请求
在前一篇文章使用jMeter构造大量并发HTTP请求进行微服务性能测试里,我介绍了如何用jMeter构造并发HTTP请求.但是通过文中介绍的方式构造的并发请求,其请求参数都是硬编码的'Wang'. 有 ...
- 编译luacheck Linux版
最近在写Visual Studio Code的Lua插件,需要把luacheck集成进去.但是luacheck默认只提供了win32版本,见https://github.com/mpeterv/lua ...
- 【python+selenium】截取某个元素
一. selenium截图1.selenium提供了几个截取全屏的方法- get_screenshot_as_file(self, filename) --这个方法是获取当前window的截图,出现I ...
- 智能指针原理及实现(2)unique_ptr
只允许基础指针的一个所有者. 可以移到新所有者(具有移动语义),但不会复制或共享(即我们无法得到指向同一个对象的两个unique_ptr). 替换已弃用的 auto_ptr. 相较于 boost::s ...
- RobHess的SIFT环境配置
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 参考博客:https://www.cnblogs.com/cql ...
- IntelliJ IDEA安装及破解
百度搜索IntelliJ IDEA,进入官网. 下载完成后进入安装界面 根据自己的情况选择安装路径 等待下载和安装完成. 安装完成 接下来我们运行IntelliJ IDEA 之后这里就要我们进行激活了 ...
- idea自动在文件头中添加作者和创建时间
设置路径 : File -> Settings -> Editor -> File and Code Templates 定制头模板: /** * @Author: chancy * ...