【转】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!"); ...
随机推荐
- 关于Nagios通过NRPE监控客户端的安装与配置
环境介绍>>>>>>>>>>>>>>>>>>>>>>>> ...
- Linux渗透之反弹Shell
前言 当我们在渗透Linux主机时,反弹一个交互的shell是非常有必要的.在搜索引擎上搜索关键字“Linux 反弹shell”,会出现一大堆相关文章,但是其内容不但雷同,而且都仅仅是告诉我们执行这个 ...
- 使用iLO远程管理HP系列服务器
iLO是Integrated Ligths-out的简称,是HP服务器上集成的远程管理端口,它是一组芯片内部集成vxworks嵌入式操作系统,通过一个标准RJ45接口连接到工作环境的交换机.只要将服务 ...
- ElasticSearch概述及Linux下的单机ElasticSearch安装
原文链接:http://blog.csdn.net/w12345_ww/article/details/52182264 这两天在项目中要涉及到ElasticSearch的使用,就上网去搜索了一些这方 ...
- iOS学习笔记06—Category和Extension
iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...
- 【JAVA】猜数字
import java.util.*; public class GN { public static void main(String arg[]) { ;// 数字标记 ;// 位置标记 ;// ...
- C++ 输入/输出
std:: 是什么?有什么作用? 输入和输出的iostream 库.iostream 库的基础是两种命名为 istream 和 ostream 的类型,分别表示输入流和输出流. 标准库定义了 4 个 ...
- iOS - 原生的CIFilter生成二维码和条形码
使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码.系统CIFilter生成的二维码和条形码的大小有时并不能满足需求, ...
- JDBC改进版
将setObject隐藏,用反射获取model里面的数据 /** * @Date 2016年7月19日 * * @author Administrator */ package com.eshore. ...
- Failed to start LSB: Bring up/down networking.
由于我的虚拟机是从别的机器拷贝过来的,导入新机器后,没有问题,第二天就网络连接不上了,就出现下面的错误 [root@centos ~]# /etc/init.d/network restart Res ...