java 学习~多线程通信 使用共享变量 例子和解释
多线程互相通信一般使用共享变量。。
完整验证代码:
main 方法
public class Test5 {public static void main(String[] args) {Datax m1=new Datax();Threadx t1=new Threadx(m1) ;Thready t2= new Thready(m1);t1.start();//就绪,被cpu选中时执行t2.start();}
}
线程的派生类 1
public class Threadx extends Thread{private Datax a;public Threadx(Datax aa) {a=aa;}@Overridepublic void run() {//int x=a.flag;//共享变量,联通 t1 和t2 try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}a.flag=10;//改变共享变量,关闭循环}}
线程的派生类 2
public class Thready extends Thread{private Datax a;public Thready(Datax aa) {a=aa;}@Overridepublic void run() {while(a.flag<10) {try {Thread.sleep(100);//每100ms输出一次} catch (InterruptedException e) {e.printStackTrace();}System.out.println("888888");}//int y=a.flag;System.out.println("5555");}
}
共享变量
public class Datax {public int flag;
}
--------------------------------------------------------------------------------------------------------------------------------
解释:
*
看 栈 和 堆内存
主线程栈 t1.start(); t2.start(); 进入就绪状态,被cpu选中,会产生两个子栈
没有共享变量时,本身两个线程是互相隔离的, 在栈中创建各自的线程栈 。
两个线程各自执行,各自的run();方法压入栈中
//main方法
public class Test5 {public static void main(String[] args) {Threadx t1=new Threadx() ;Thready t2= new Thready();t1.start();//就绪,被cpu选中时执行t2.start();}
}
//线程派生类 x
public class Threadx extends Thread{@Overridepublic void run() {}
}x
//线程派生类 y
public class Thready extends Thread{@Overridepublic void run() {}
}
**
创建共享变量,通过值传递,通过构造方法,让 Threadx,Thready 中的 a,共同指向内存同一个地方 。当前 flag还是零
主线程中添加了,对象m1。t1,t2加入了各自的成员 a,通过构造方法,使t1,t2中的a 指向了aa,也是指向了 m1 的值的地址,也就是说 m1 在 t1,t2 两个线程里都指向了同一个地方。
自己的方法可以访问自己的变量,run()方法能访问各自的 a,t1,t2的 run()方法 真正运行的时候,能对各自的 a 操作,各自的 a 又指向同一个地方。
public class Datax {public int flag;
}
//main 方法
public class Test5 {public static void main(String[] args) {Datax m1=new Datax();Threadx t1=new Threadx(m1) ;Thready t2= new Thready(m1);t1.start();//就绪,被cpu选中时执行t2.start();}
}
//线程派生类 x
public class Threadx extends Thread{private Datax a;//构造方法public Threadx(Datax aa) {a=aa;}@Overridepublic void run() {}
}
//线程派生类 y
public class Thready extends Thread{private Datax a;//构造方法public Threadx(Datax aa) {a=aa;}@Overridepublic void run() {}
}
***
然后就可以读到 a
//线程派生类 x
public class Threadx extends Thread{private Datax a;//构造方法public Threadx(Datax aa) {a=aa;}@Overridepublic void run() {int x=a.flag}
}
//线程派生类 x
public class Thready extends Thread{private Datax a;//构造方法public Threadx(Datax aa) {a=aa;}@Overridepublic void run() {int y=a.flag}
}
最终 x 和 y 可以指向同一个值,任意一方改变 flag 的值 另一边就会接收到。
最后解释最上方的完整验证代码:
Thready 中 当 a.flag <10 时 循环每100ms 输出一次“888888”,出循环时 输出“5555”
Threadx 中在1秒后 使 a.flag=10。
a.flag=10 不 <10 所以输出结果如此,可见二者通过共享变量进行了互通。
//线程派生类 x
public class Threadx extends Thread{private Datax a;public Threadx(Datax aa) {a=aa;}@Overridepublic void run() { try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}a.flag=10;//改变共享变量,关闭循环
//int x=a.flag;}}
//线程派生类 y
public class Thready extends Thread{private Datax a;public Thready(Datax aa) {a=aa;}@Overridepublic void run() {while(a.flag<10) {try {Thread.sleep(100);//每100ms输出一次} catch (InterruptedException e) {e.printStackTrace();}System.out.println("888888");}//int y=a.flag;System.out.println("5555");}
}
整个输出结果:
java 学习~多线程通信 使用共享变量 例子和解释相关推荐
- Java实现串口通信的小例子
用Java实现串口通信(windows系统下),需要用到sun提供的串口包 javacomm20-win32.zip.其中要用到三个文件,配置如下: 1.comm.jar放置到 JAVA_HOME/j ...
- java的多线程访问共享变量_java多线程通信之共享变量
(1)当访问共同的代码的时候:可以使用同一个Runnable对象,这个Runnable对象中有这个共享数据,比如卖票系统就可以这么做.或者这个共享数据封装在一个对象当中,然后对这个对象加锁,也可以实现 ...
- Java学习--多线程
1.实现多线程 1.1简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 1.11多线程实现三种方式( ...
- java学习6:商品管理系统例子
商品信息管理 --使用HashMao对商品信息进行管理 key为商品编号,value为商品对象 --对HashMap中的商品信息进行增删改查 商品信息类: 属性:商品编号id,商品名 ...
- 第十章 进程间的通信 之 Java/Android多线程开发(二)
文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...
- Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍
1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...
- java程序假死_分析一个常见的java多线程通信问题(假死现象)
一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了.对于线程来说也是,通过多个线程就能完成一个更复杂的功能,这就需要多个线程协作,协作就需要交流,但是交流总是会出问题的.在这篇 ...
- Java 学习 Day17 多线程
Java 学习 Day17 文章目录 Java 学习 Day17 一.基本概念:程序.进程.线程 二.线程的创建和使用 三.多线程的创建,方式一:继承于Thread类 四. 创建多线程的方式二:实现R ...
- Java学习笔记---多线程并发
Java学习笔记---多线程并发 (一)认识线程和进程 (二)java中实现多线程的三种手段 [1]在java中实现多线程操作有三种手段: [2]为什么更推荐使用Runnable接口? [3][补充知 ...
最新文章
- SAP PM 入门系列2 - IE03显示设备主数据
- 【FPGA】Buffer专题介绍(三)
- ICMP隧道工具ptunnel
- 如此通俗的分布式锁讲解,如果还搞不定那就...
- vs调用堆栈窗口怎么弄出来_从零开始(1)栈帧、调用约定
- Kitten编程猫 里的克隆体无法进行边缘检测
- Java知多少(105)套接字(Socket)
- 来自未来的缓存 Caffeine,带你揭开它的神秘面纱
- jmeter学习指南之快速玩转16个逻辑控制器
- React组件: 提取图片颜色
- cad2018安装教程_AUTO CAD2018安装教程+安装包
- 微信开发工具小程序获取手机号失败
- Python-OpenCV——Image inverting
- 2、PM模块中的主数据
- 如何免费使用jrebel 和eclipse 项目配合完成热部署功能
- Golang连接kafka报错: Errorkafka: client has run out of available brokers to talk to
- rtx自建服务器,腾讯通RTX服务器端如何安装和配置
- pm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: undefi
- IE安全系列:IE的自我介绍 (I)
- SANGFOR AC设备如何开启上网实名认证