100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > java 学习~多线程通信 使用共享变量 例子和解释

java 学习~多线程通信 使用共享变量 例子和解释

时间:2024-01-11 09:51:09

相关推荐

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 和t2try {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();}}

//线程派生类 xpublic class Threadx extends Thread{@Overridepublic void run() {}}x

//线程派生类 ypublic 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();}}

//线程派生类 xpublic class Threadx extends Thread{private Datax a;//构造方法public Threadx(Datax aa) {a=aa;}@Overridepublic void run() {}}

//线程派生类 ypublic class Thready extends Thread{private Datax a;//构造方法public Threadx(Datax aa) {a=aa;}@Overridepublic void run() {}}

***

然后就可以读到 a

//线程派生类 xpublic class Threadx extends Thread{private Datax a;//构造方法public Threadx(Datax aa) {a=aa;}@Overridepublic void run() {int x=a.flag}}

//线程派生类 xpublic 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 所以输出结果如此,可见二者通过共享变量进行了互通。

//线程派生类 xpublic 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;}}

//线程派生类 ypublic 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");}}

整个输出结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。