Java多个线程之间处理共享数据的方式

本文介绍了一种通过两个线程对共享变量进行加1操作,另两个线程进行减1操作的具体实现方法。通过创建共享数据类并在其中定义同步方法,确保了线程间的互斥与通信。此外,还提供了两种实现思路:一是通过Runnable对象传递共享数据;二是利用外部类成员变量及方法实现共享数据操作。
摘要由CSDN通过智能技术生成
题目要求:


有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现?

分析:
    x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到“窗口买票问题”,但是卖票只是单纯的减。

所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题。

如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之间的数据共享:

第一种:将共享数据封装到一个对象中,把这个共享数据所在的对象传递给不同的Runnable,每个线程对共享数据的操作也分给那个

对象完成,这样就可以实现对该数据处理的互斥与通信。

class ShareData {
	private int x = 0;

	public synchronized void addx(){
	
			x++;
			System.out.println("x++ : "+x);
		
	}
	public synchronized void subx(){
	
			x--;
			System.out.println("x-- : "+x);
			
	}
}
class MyRunnable1 implements Runnable{
	private ShareData share1 = null;
	public MyRunnable1(ShareData share1) {
		this.share1 = share1;
		
	}
	public void run() {
		for(int i = 0;i<100;i++){
		share1.addx();
		}
	}
}
class MyRunnable2 implements Runnable{
	private ShareData share2 = null;
	public MyRunnable2(ShareData share2) {
		this.share2 = share2;
		
	}
	public void run() {
		for(int i = 0;i<100;i++){
		share2.subx();
		}
	}
}
public class ThreadsVisitData {

	  
	public static void main(String[] args) {
		ShareData share = new ShareData();
		new Thread(new MyRunnable1(share)).start();
		new Thread(new MyRunnable2(share)).start();
	
	}
}


第二种:

将这些Runnable对象作为某一个类的内部类,共享的数据作为外部类的成员变量,对共享数据的操作分配给外部类的方法来完成,以此实现对操作共享
数据的互斥和通信,作为内部类的Runnable来操作外部类的方法,实现对数据的操作


class ShareData {
	private int x = 0;

	public synchronized void addx(){
			x++;
			System.out.println("x++ : "+x);
	}
	public synchronized void subx(){
			x--;
			System.out.println("x-- : "+x);
	}
}

public class ThreadsVisitData {

	 public static ShareData share = new ShareData();
	 
	public static void main(String[] args) {
		//final ShareData share = new ShareData();
		new Thread(new Runnable() {
	
			public void run() {
				for(int i = 0;i<100;i++){
				share.addx();
				}
			}
			}).start();
		new Thread(new Runnable() {
	
				public void run() {
					for(int i = 0;i<100;i++){
					share.subx();
					}
				}
			}).start(); 
	}
}

总结:要同步互斥的代码任务最好将他们分别放在独立的方法中,这些方法再放在同一个类中,这样比较容易实现操作的同步和通信


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值