多线程互相通信一般使用共享变量。。
完整验证代码:
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");}}
整个输出结果: