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;
	}
	@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();方法压入栈中

java 学习~多线程通信 使用共享变量 例子和解释_第1张图片

//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 又指向同一个地方。

java 学习~多线程通信 使用共享变量 例子和解释_第2张图片

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
	}
}

java 学习~多线程通信 使用共享变量 例子和解释_第3张图片

 最终 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");
	}
}

整个输出结果:java 学习~多线程通信 使用共享变量 例子和解释_第4张图片

你可能感兴趣的:(学习)