线程通信:

  如果线程A和线程B持有同一个MyObject类的对象object,这两个线程会去调用不同的方法,但是它们是同步执行的,比如:线程B需要等待线程A执行完了methodA()方法之后,它才能执行methodB()方法。这样,线程A和线程B就实现了 通信。

线程通信中要用到的方法:wait()方法:

  执行同步锁(obj对象)的该方法的线程进入堵塞状态,会释放对象的锁,java虚拟机把该线程放到该对象的等待池中,该线程如果要再次执行,则需要其他线程将它唤醒。

 package tongxin;

 public class MyThreadA extends Thread {
private Object obj;
public MyThreadA(String name,Object obj){ super(name);
this.obj = obj; }
public void run(){
synchronized(obj){ //设置obj为同步锁 for(int i = 0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"---"+i); if(i == 5){
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
} }
 package tongxin;

 public class Demo01 {

     public static void main(String[] args) {
// TODO Auto-generated method stub Object obj = new Object();
MyThreadA mt1 = new MyThreadA("A",obj);
mt1.start(); } }

output:

 A---0
A---1
A---2
A---3
A---4
A---5

当i = 5时,执行了同步锁的wait()方法,然后线程A将同步锁释放进入堵塞状态,如果A线程还有恢复运行,则需要另一个持相同同步锁的线程将其唤醒。

唤醒线程的方法:notifi()

  另一个线程在运行过程中执行了同步锁的notifi方法,  会唤醒在对象的等待池中等待的一个线程(随机选择),java虚拟机会随机选择一个线程转到对象的锁池中。

  注意一个线程要去唤醒另一个执行了wait()方法进入堵塞状态的线程,则其要去执行同一个同步锁的notifi()方法。

  假如有一个房间,A进去之后把门锁上,A在房间里睡着了,B要把A叫醒,就要用锁(同步锁)上的钥匙把门开开。A与B用的是同一把锁,只不过A是在锁门(wait()方法),B是在开门(notifi()方法)。

 package tongxin;

 public class MyThreadB extends Thread {
private Object obj;
public MyThreadB(String name,Object obj){ super(name);
this.obj = obj; }
public void run(){
synchronized(obj){ //设置obj为同步锁 for(int i = 0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"---"+i); if(i == 2){
obj.notify();
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
} }
 package tongxin;

 public class Demo01 {

     public static void main(String[] args) {
// TODO Auto-generated method stub Object obj = new Object();
MyThreadA mt1 = new MyThreadA("A",obj);
MyThreadB mt2 = new MyThreadB("B",obj);
mt1.start();
mt2.start(); } }

output:

A---0
A---1
A---2
A---3
A---4
A---5
B---0
B---1
B---2
B---3
B---4
B---5
B---6
B---7
B---8
B---9
A---6
A---7
A---8
A---9

创建一个新的线程对象B来唤醒A线程,运行过程中,i = 2时,B唤醒A线程将其转到对象的锁池中,但此时由于B持有同步锁所以B线程继续运行,运行结束后释放同步锁,此时A获取到同步锁恢复运行。

notifyAll()方法:

该方法会唤醒在这个对象锁池中的所有线程。

如有不对之处还望指正,谢谢。

JavaSE——线程通信的更多相关文章

  1. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  2. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  3. Linux下c开发 之 线程通信(转)

    Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...

  4. C# 线程通信 一

    C#多线程通信 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  5. java多线程-线程通信

    线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...

  6. Java---Condition控制线程通信

    java中控制线程通信的方法有:1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyAll()控制线程通信.不灵活. 2.利用Conditio ...

  7. Java 线程通信

    线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题. 1.传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定, ...

  8. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  9. java笔记--关于线程通信

    关于线程通信 使用多线程编程的一个重要原因就是线程间通信的代价比较小 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.h ...

随机推荐

  1. flask~数据库

    flask与数据库的连接基于flaks_sqlaichemy 扩展 首先要连接数据库的时候必须得先下载 pip install flask-sqlalchemy 这个扩展 flask框架与数据库的连接 ...

  2. odoo开发笔记 -- 安装Backend debranding去除odoo信息模块后 隐藏开发者模式

    Backend debranding 找到如下文件,将相关灰色代码注释掉. <?xml version="1.0" encoding="UTF-8"?&g ...

  3. 利用VS2017跨平台远程调试aspnetcore应用

    vs2017开始支持跨平台远程调试coreclr的应用,通常用于调试linux与mac上运行的aspnetcore程序,而如果运行在docker中的应用 要使用跨平台远程调试功能,首先运行corecl ...

  4. css - bootstrap3下拉菜单点击之后怎么改变背景颜色?

    css添加 .navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:focus, .n ...

  5. oc中的枚举

    如果一个变量只有几种可能的值,比如星期有几天,一年有几个季节等.这个时候可以用枚举变量. 先定义类型再定义变量,如:enum siji{chun,xia,qiu,dong} 也可以定义匿名:enum{ ...

  6. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cmd— ...

  7. CSS3 Drop-Shadows效果制作教程分享

    要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识. 开发环境 Adobe Dreamweaver CS6/Chrome浏览器 演示地址 演示地址 Drop-Shadow效果,其实就是大家熟 ...

  8. Centos iptables防火墙关闭启动详解

    CentOS .0默认使用的是firewall作为防火墙,使用iptables必须重新设置一下 .直接关闭防火墙 systemctl stop firewalld.service #停止firewal ...

  9. solr(三) : 导入数据库表数据

    solr 除了能查询文档中的数据外, 还可以导入数据库中的数据. 也就是说, solr 能查询其他数据库中的数据(solr本身也是一个数据库, 非关系型的). 那接下来就试一下导入mysql数据库中的 ...

  10. Qt5——从零开始的Hello World教程(Qt Creator)

    简单Qt教程 一.打开Qt Creator 本次的目的是用Qt Creator建立一个Hello World项目,在安装Qt之后,首先要打开Qt Creator. 就是它啦,打开后会显示如下页面. 二 ...