搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > Java编程精选 > Java中的线程之线程间的通信

Java中的线程之线程间的通信

Java编程精选 2018-07-01

关键时刻,第一时间送达!


hello各位小伙伴

今天我们来搞一下

线程之间的通信

( • ̀ω•́ )✧

让线程按照我们的想法来执行

两个线程间的通信

这是我们之前的线程。

Java中的线程之线程间的通信


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

Java中的线程之线程间的通信


实现线程交替执行:

Java中的线程之线程间的通信


这里主要用到了两个内容

1)创建一个标记 flag,让程序进行判断:

当flag != 1 时,print1 进入等待,执行 print2,然后让 flag=1,唤醒正在等待·的线程,

当flag != 0 时,print2 进入等待,执行 print1 ,让后让 flag=0,唤醒正在等待的线程。


2)在 object 类中有 wait() 和 notify() 方法,可以对线程进行等待和唤醒的操作

Java中的线程之线程间的通信

多个线程间的通信

两个线程搞定了,那么再多一点呢?


这个时候用 notify() 方法就不够了,这个方法只能唤醒单个的线程,要用notifyAll,唤醒所有正在等待的线程,然后让他们自行匹配,谁满足条件谁就运行~

Java中的线程之线程间的通信

注意:

在同步代码块中,用哪个对象锁,就用那个对象调用 wait() 方法。

sleep() 和 wait() 方法的区别

这两个方法的功能很像,但是还是有一点区别的~

第一点:

sleep()方法必须给一个参数,参数就是等待的时间,时间到了自动醒来。

wait()方法也可以传入参数,程序在参数代表的时间结束后进入等待,不传参数表示程序直接进入等待。


第二点:

sleep()方法在同步代码块或同步函数中,不释放锁。

wait()方法在同步代码块或同步函数中,释放锁。

JDK1.5的特性
互斥锁 ReentrantLock

一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 


这里面有一个 newCondition()方法 

以返回一个 Condition 实例。 这个实例可以调用下面的方法,我们主要用到了圈起的两个方法~


Java中的线程之线程间的通信


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

Java中的线程之线程间的通信

线程的生命周期

就是一个线程的生命周期,小伙伴们看一下,学了一回线程,这个东西还是要了解一下的~


Java中的线程之线程间的通信

图片自来网络

线程组

线程组概述

Java 中使用 ThreadGroup 来表示线程组,它可以对一批线程进行分类管理,Java 允许程序直接对线程组进行控制。


默认情况下,所有的线程都属于主线程组。

getThreadGroup()

通过线程对象获取他所属于的组

getName()

通过线程组对象获取他组的名字

Java中的线程之线程间的通信


我们也可以给线程设置分组

步骤如下:

1)ThreadGroup(String name) 创建线程组对象并给其赋值名字

2)创建线程对象

3)Thread(ThreadGroup, Runnable,name) 

4)设置整组的优先级或者守护线程


代码演示:

Java中的线程之线程间的通信

线程池

程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。


线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。(从JDK5开始,Java内置支持线程池)


内置线程池的使用概述

JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法

newFixedThreadPool(int nThreads)

newSingleThreadExecutor()

这些方法的返回值是 ExecutorService 对象,该对象表示一个线程池,可以执行 Runnable 对象或者 Callable 对象代表的线程。它提供了如下方法

submit(Runnable task)

submit(Callable<T> task)


使用步骤:

1)创建线程池对象

2)创建Runnable实例

3)提交Runnable实例

4)关闭线程池


代码演示:


线程的知识点就分享到这了

要是有落下的部分

就当做伙伴们自学的练习了

φ(>ω<*) 

就这么愉快的决定了


  • 来源:java联盟

  • https://mp.weixin.qq.com/s/nEMweGIHHD5HCB1lMco7RQ

  • Java编程精选整理发布,转载请联系作者获得授权

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《Java中的线程之线程间的通信》的版权归原作者「Java编程精选」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注Java编程精选微信公众号

Java编程精选微信公众号:JavaPush

Java编程精选

手机扫描上方二维码即可关注Java编程精选微信公众号

Java编程精选最新文章

精品公众号随机推荐