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&timestamp=1530322070

【转】Java学习:Java中的线程之线程间的通信的更多相关文章

  1. java学习——java中的反射学习笔记

    Java--reflect 一.Class类的使用 什么是Class类? 1:在面向对象的世界中,万事万物皆对象. java语言中,静态的成员,普通数据类型类是不是对象呢? 是,对象!是类的对象! 类 ...

  2. [Java学习] Java虚拟机(JVM)以及跨平台原理

    相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...

  3. java学习之浅谈多线程3--线程间协作

    通过保证临界区上多个线程的相互排斥,线程同步完全可以避免竞争状态的发生,但是有时还需要线程之间的协作.有两种方式可用于线程间的通信. 1.使用条件Condition Condition接口: +awa ...

  4. [Java学习] Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: 1 ...

  5. java学习-http中get请求的非ascii参数如何编码解码探讨

    # 背景: 看着别人项目代码看到一个PathUtils工具类, 里面只有一个方法,String  rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中 ...

  6. 【转】Java学习---Java中volatile关键字实现原理

    [原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.c ...

  7. 详解Java多线程编程中LockSupport类的线程阻塞用法

    LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: p ...

  8. Java学习--Java 中基本类型和字符串之间的转换

    Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...

  9. Java学习--Java 中的包装类

    Java 中的包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能简 ...

  10. java学习(更新中)

    class Test { public static void main(String[] args) { System.out.println("Hello World!"); ...

随机推荐

  1. AppScan扫描建议 问题集

    1.1        AppScan扫描建议 若干问题的补救方法在于对用户输入进行清理. 通过验证用户输入未包含危险字符,便可能防止恶意的用户导致应用程序执行计划外的任务,例如:启动任意 SQL 查询 ...

  2. 8.27 jQuery

    2018-8-27 19:38:06 jQuery 参考http://www.cnblogs.com/liwenzhou/p/8178806.html jQuery练习题和 .js文件在Github  ...

  3. Timer应用之Interval优化

    开发中, 有时有这种场景,使用 Timer 的 Timer_Elapsed 间隔  执行(如:从数据库)获取数据 与 现有 应用服务器中的 静态变量数据(起到缓存的目的)做 对比 ,若有改变,则 更新 ...

  4. 重写jquery serialize 方法

    /**取表单中的对象 *attrName:为元素的的属性名称不设置则默认为name */ $.fn.serialize = function (attrName) { var ret = {}; if ...

  5. XTU 1264 - Partial Sum - [2017湘潭邀请赛E题(江苏省赛)]

    2017江苏省赛的E题,当时在场上看错了题目没做出来,现在补一下…… 题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id ...

  6. int float 的具体的取值范围取决于具体的机器 整数除法舍位 整形(int)也可以用于存储字符型数据

    int  通常为16位  存储单元 float  通常为32位 取决于具体的机器 #include main() { int fathr,celsius; int lower,upper,step; ...

  7. 2018/04/03 每日一个Linux命令 之 lastb/last

    今天还在想暴力破解一个服务器是怎么完成的....... -- lastb功能说明:列出登录系统失败的用户相关信息. -- 单独执行 lastb 时候,它会读取/var/log 下的 btmp 文件,输 ...

  8. mybatis联接查询例子

    where判断如果放在最外层就是对连接查询后的结果经行筛选. SELECT * from ( and lw_area.area_id like '35%' ) la LEFT JOIN ( selec ...

  9. easyui DataGrid表体单元格跨列rowspan

    最近做项目用到了jquery easyui,其中一组DataGrid做的报表是给客户大领导看的,客户要求报表样式跟他们原有系统的一模一样(如下图1). DataGrid样式好调,只是城市名称单元格跨行 ...

  10. Python学习方法(待补充)

    一.好思想总结: 1.一个东西,正在学会了,是需要能简单教会别人,才是真正的理解透彻了,要是讲不透彻,还是一知半解. 2.思路别人教不了你,学会简单处理任何问题,再复杂的东西,在我看来现实项目中,很多 ...