【原文】https://www.toutiao.com/i6572378564534993415/

两个线程间的通信

这是我们之前的线程。

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

实现线程交替执行:

这里主要用到了两个内容

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)关闭线程池

代码演示:

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

  1. 【转】Java学习:Java中的线程之线程间的通信

    hello各位小伙伴 今天我们来搞一下 线程之间的通信 ( • ̀ω•́ )✧ 让线程按照我们的想法来执行 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: ...

  2. Java核心知识点学习----多线程并发之线程间的通信,notify,wait

    1.需求: 子线程循环10次,主线程循环100次,这样间隔循环50次. 2.实现: package com.amos.concurrent; /** * @ClassName: ThreadSynch ...

  3. Java多线程——线程间通信

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...

  4. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  5. Java多线程中线程间的通信

    一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.u ...

  6. Java 多线程(七) 线程间的通信——wait及notify方法

    线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...

  7. Java多线程之线程的状态以及线程间协作通信导致的线程状态转换

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html  一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...

  8. Java基础教程:多线程基础(2)——线程间的通信

    Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 ...

  9. 新建线程与UI线程间的通信

    现在用一个实例来演示一下自己的新建线程与UI线程间的通信. UI界面包含3个控件: 一个输入框,用来输入数字: 一个显示框,用来显示从2开始,到输入数字之间的所有质数: 一个按钮,点击后获取输入框输入 ...

随机推荐

  1. Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式

    当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式.Tomcat支持四种容器管理的安全防护,它们是: BASIC (基本验证):通过HTTP验证,需要提供base64编码文本的 ...

  2. LVS+keepalived+nginx+tomcat部署实现

    拓扑如下所示 # 节点分布情况 LVS-dr-master eth0: 192.168.146.141 LVS-dr-slave eth0: 192.168.146.142 nginx1: eth0: ...

  3. 并发编程—— LinkedTransferQueue

    1. 前言 Java 中总的算起来有 8 种阻塞队列. 我们分析了: 并发编程之 SynchronousQueue 核心源码分析 并发编程之 ConcurrentLinkedQueue 源码剖析 并发 ...

  4. c++/c 获取cpp文件行号跟文件名

    编译器内置宏: 先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): ...

  5. MFC函数—CSingleDocTemplate

    前提:在InitInstance() 函数的初始化过程中,我们可以看到代码CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDoc ...

  6. sql 中有关时间的语句

    1.比较得到两个时间相差的间隔 SELECT datediff(minute, ’2009-04-28 12:05:00′, getdate()); SELECT datediff(month, ’2 ...

  7. Go语言封装Http协议GET和POST请求

    本文几乎没有文字叙述: /* 有关Http协议GET和POST请求的封装 */ package net import ( "net/http" "io" &qu ...

  8. winform窗体 小程序【移动窗体和阴影】

    窗体无边框设置后无法移动,引用API 使其获得功能 移动 //窗体移动API [DllImport("user32.dll")] public static extern bool ...

  9. thinkphp 网址后台典型页面

    知识点: 1.select a提交后 返回选中项 选中项 value是id 但是要显示name b遍历和列举两种形式 <select name="class_id" clas ...

  10. 畅通工程再续(hdu1875) 并查集

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...