java学习之线程(多个线程共享数据并对数据进行操作)

问题:使用多线程对j进行两次++和两次--操作

1.将数据以及对数据的操作封装成一个类,然后再主线程中初始化,在创建多线程来对数据进行操作。


package Thread;

public class MultiThreadShareDataMethod1 {
	public static void main(String[] args) {
		ShareData sData = new ShareData();
		
		for(int i = 0; i<2; i++)
		{
			new Thread(new Runnable() {
				@Override
				public void run() {
					sData.Increase();
				}
			}).start();
			new Thread(new Runnable() {
				@Override
				public void run() {
					sData.Decrease();
				}
			}).start();
		}
		//打印出来的不是最后的j值,因为四个线程和主线程是一起运行的,执行输出的时候,其他的线程不一定运行完了
		//System.out.println("输出最后的j="+sData.Get());
	}
	static class ShareData{
		private int j = 0;
		//synchronized这个关键字容易忘掉,
		public synchronized void Increase() {
			j++;
			System.out.println("j++后的值为:"+j);
		}
		public synchronized void Decrease() {
			j--;
			System.out.println("j--后的值为:"+j);
		}
		public int Get() {
			return j;
		}
	}
}

2.将数据单独声明在外部方法中,创建两个内部继承Runnable接口的类来共享主方法中的数据j,一个类在run中++,一个类在run    中--,最后在主线程中创建Thread并传入对象。

package Thread;

public class MultiThreaedShareDataMethod2 {
	private static int j = 0;//共享的数据
	
	public static void main(String[] args) {
		for (int i = 0; i < 2; i++) {
			new Thread(new ShareDataInc()).start();
			new Thread(new ShareDataDec()).start();
		}
	}
	static class ShareDataInc implements Runnable{
		@Override
		public void run() {
			Increase();
		}
		public synchronized void Increase() {
			j++;
			System.out.println("j++后的值:"+j);
		}
	}
	static class ShareDataDec implements Runnable{
		@Override
		public void run() {
			Decrease();//不要在run方法里面加加或减减,因为多线程运行的时候可能会出现计算上的错误
			//最好是单独写出来一个synchronized的方法来专门进行加减操作
		}
		public synchronized void Decrease() {
			j--;
			System.out.println("j--后的值:"+j);
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值