【转】Java学习:Java中的线程之线程间的通信
hello各位小伙伴
今天我们来搞一下
线程之间的通信
( • ̀ω•́ )✧
让线程按照我们的想法来执行
两个线程间的通信
这是我们之前的线程。

执行效果:谁抢到资源,谁运行~

实现线程交替执行:

这里主要用到了两个内容
1)创建一个标记 flag,让程序进行判断:
当flag != 1 时,print1 进入等待,执行 print2,然后让 flag=1,唤醒正在等待·的线程,
当flag != 0 时,print2 进入等待,执行 print1 ,让后让 flag=0,唤醒正在等待的线程。
2)在 object 类中有 wait() 和 notify() 方法,可以对线程进行等待和唤醒的操作

多个线程间的通信
两个线程搞定了,那么再多一点呢?
这个时候用 notify() 方法就不够了,这个方法只能唤醒单个的线程,要用notifyAll,唤醒所有正在等待的线程,然后让他们自行匹配,谁满足条件谁就运行~

注意:
在同步代码块中,用哪个对象锁,就用那个对象调用 wait() 方法。
sleep() 和 wait() 方法的区别
这两个方法的功能很像,但是还是有一点区别的~
第一点:
sleep()方法必须给一个参数,参数就是等待的时间,时间到了自动醒来。
wait()方法也可以传入参数,程序在参数代表的时间结束后进入等待,不传参数表示程序直接进入等待。
第二点:
sleep()方法在同步代码块或同步函数中,不释放锁。
wait()方法在同步代码块或同步函数中,释放锁。
JDK1.5的特性
互斥锁 ReentrantLock
一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。
这里面有一个 newCondition()方法
可以返回一个 Condition 实例。 这个实例可以调用下面的方法,我们主要用到了圈起的两个方法~

那么我们实现上面的功能的代码,就可以这样来写

线程的生命周期
就是一个线程的生命周期,小伙伴们看一下,学了一回线程,这个东西还是要了解一下的~
线程组
线程组概述
Java 中使用 ThreadGroup 来表示线程组,它可以对一批线程进行分类管理,Java 允许程序直接对线程组进行控制。
默认情况下,所有的线程都属于主线程组。
getThreadGroup()
通过线程对象获取他所属于的组
getName()
通过线程组对象获取他组的名字
我们也可以给线程设置分组
步骤如下:
1)ThreadGroup(String name) 创建线程组对象并给其赋值名字
2)创建线程对象
3)Thread(ThreadGroup, Runnable,name)
4)设置整组的优先级或者守护线程
代码演示:
线程池
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。(从JDK5开始,Java内置支持线程池)
内置线程池的使用概述
JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法
newFixedThreadPool(int nThreads)
newSingleThreadExecutor()
这些方法的返回值是 ExecutorService 对象,该对象表示一个线程池,可以执行 Runnable 对象或者 Callable 对象代表的线程。它提供了如下方法
submit(Runnable task)
submit(Callable<T> task)
使用步骤:
1)创建线程池对象
2)创建Runnable实例
3)提交Runnable实例
4)关闭线程池
代码演示:

线程的知识点就分享到这了
要是有落下的部分
就当做伙伴们自学的练习了
φ(>ω<*)
就这么愉快的决定了
原文链接:https://www.toutiao.com/a6572378564534993415/?iid=35569335335&app=news_article×tamp=1530322070
【转】Java学习:Java中的线程之线程间的通信的更多相关文章
- java学习——java中的反射学习笔记
Java--reflect 一.Class类的使用 什么是Class类? 1:在面向对象的世界中,万事万物皆对象. java语言中,静态的成员,普通数据类型类是不是对象呢? 是,对象!是类的对象! 类 ...
- [Java学习] Java虚拟机(JVM)以及跨平台原理
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...
- java学习之浅谈多线程3--线程间协作
通过保证临界区上多个线程的相互排斥,线程同步完全可以避免竞争状态的发生,但是有时还需要线程之间的协作.有两种方式可用于线程间的通信. 1.使用条件Condition Condition接口: +awa ...
- [Java学习] Java Object类
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: 1 ...
- java学习-http中get请求的非ascii参数如何编码解码探讨
# 背景: 看着别人项目代码看到一个PathUtils工具类, 里面只有一个方法,String rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中 ...
- 【转】Java学习---Java中volatile关键字实现原理
[原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.c ...
- 详解Java多线程编程中LockSupport类的线程阻塞用法
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: p ...
- Java学习--Java 中基本类型和字符串之间的转换
Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...
- Java学习--Java 中的包装类
Java 中的包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能简 ...
- java学习(更新中)
class Test { public static void main(String[] args) { System.out.println("Hello World!"); ...
随机推荐
- 兵器簿之cocoaPods的安装和使用
以前添加第三方库的时候总是直接去Github下载然后引入,但是如果这些第三方库发生了更新,我们还需要手动去更新项目,所以现在引入之前一直想弄都一直没有弄的cocoaPods,现在演示一把过程 其实非常 ...
- vue--使用定时器的问题
https://blog.csdn.net/ywl570717586/article/details/79963162
- Spring Framework核心概念之Bean生命周期管理
目录 Spring Bean的生命周期 相关接口的分类 测试SpringBean生命周期的Demo程序 小结 Spring Bean的生命周期 Spring容器既Application或者WebApp ...
- [EF]vs15+ef6+mysql code first方式
写在前面 前面有篇文章,尝试了db first方式,但不知道是什么原因一直没有成功,到最后也没解决,今天就尝试下code first的方式. [EF]vs15+ef6+mysql这个问题,你遇到过么? ...
- c++中用vector创建多维数组的初始化方法
最近调试一个程序,在使用vector声明一个二维数组时出现错误.错误的方法如下所示: std::vector<std::vector<double> > sphereGrid; ...
- @font-face 字体图标的应用
所谓字体图标,顾名思义就是图标以字体的形式存在,可以利用 font-size.color 对字体图标的大小和颜色进行渲染.将小图标集中放到字体库里,利用css3 @font-face 引用图标,不仅有 ...
- 如何删除word中多余的空格和空行
去除word中多余的空格及空行 一.去掉表格和格式 为了版面的整齐,网页文档都是以表格的形式存在的,只是一般情况下表格的颜色被设为无色或表格宽度被设为0,所以我们在网页上看不到表格.另外,网 页文档中 ...
- ubuntu 下关闭apache服务自动启动
最近在自己的ubuntu安装了apache服务器,每次开机的时候通过: ps -A 命令发现apache服务总是自动启动,如下: 本来自己的电脑内存就小,现在也不用这个服务,所以想让apa ...
- oracle显示转换字段类型cast()函数
今天遇到一个查询类型转换的问题:表的字段是varchar2类型,然后查询到的结果要转换为number(20,2),刚开始的时候使用to_number()函数,发现不能满足需求.后来才知道,原来还有ca ...
- 给sql server2005打补丁报错:无法安装Windows Installer MSP文件
给sql server2005打补丁报错:无法安装Windows Installer MSP文件 在我们安装完SQL2005数据库后,需要安装SP4补丁时,会出错:无法安装Windows Instal ...