多线程互相通信一般使用共享变量。。
完整验证代码:
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;
}
@Override
public 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;
}
@Override
public 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{
@Override
public void run() {
}
}x
//线程派生类 y
public class Thready extends Thread{
@Override
public 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;
}
@Override
public void run() {
}
}
//线程派生类 y
public class Thready extends Thread{
private Datax a;
//构造方法
public Threadx(Datax aa) {
a=aa;
}
@Override
public void run() {
}
}
***
然后就可以读到 a
//线程派生类 x
public class Threadx extends Thread{
private Datax a;
//构造方法
public Threadx(Datax aa) {
a=aa;
}
@Override
public void run() {
int x=a.flag
}
}
//线程派生类 x
public class Thready extends Thread{
private Datax a;
//构造方法
public Threadx(Datax aa) {
a=aa;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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");
}
}