四线程加一减一面试题

package cn.everest.thread;

public class OperateThreadShareDate2 {

	public static void main(String[] args) {

		Resource resource = new Resource();
		IncreData increData = new IncreData(resource);
		DecreData decreData = new DecreData(resource);

		for (int i = 0; i < 2; i++) {
			new Thread(increData).start();
			new Thread(decreData).start();
		}
	}
}

class IncreData implements Runnable {
	private Resource resource;

	public IncreData(Resource resource) {
		this.resource = resource;
	}

	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			 resource.increment();
		}
	}
}

class DecreData implements Runnable {
	private Resource resource;

	public DecreData(Resource resource) {
		this.resource = resource;
	}

	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			 resource.decrement();
		}
	}
}

class Resource {
	private int x = 0;
	private boolean flag = false;
	public Resource() {
	}

	public void increment() {
		synchronized (this) {
			try {
				while (flag) {
					this.wait();
				}
				x = x + 1;
				System.out.println("x +++++++++++++++++++++++: " + x);
				flag = !flag;
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				this.notifyAll();
			}
		}
	}

	public void decrement() {
		synchronized (this) {
			try {
				while (!flag) {
					this.wait();
				}
				x = x - 1;
				System.out.println("x ------------: " + x);
				flag = !flag;
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				this.notifyAll();
			}
		}
	}
}

 

内部类实现:

package cn.everest.thread;

public class OperateThreadShareData {
	
	ShareData shareData = new ShareData();
	public static void main(String[] args) {
		
		OperateThreadShareData threadShareData = new OperateThreadShareData();
		MyRunnable1 myRunnable1 = threadShareData.new MyRunnable1();
		MyRunnable2 myRunnable2 = threadShareData.new MyRunnable2();
		
		for (int i = 0; i < 2; i++) {
			new Thread(myRunnable1).start();
			new Thread(myRunnable2).start();
		}
	}
	
	class MyRunnable1 implements Runnable {
		public void run() {
			for (int i = 0; i < 50; i++) {
				shareData.increment();
			}
		}
	}
	
	class MyRunnable2 implements Runnable {
		public void run() {
			for (int i = 0; i < 50; i++) {
				shareData.decrement();
			}
		}
	}
}

class ShareData{
	private int data = 0;
	public ShareData() {}
	
	public synchronized void increment(){
		try {
			while(data > 0) {
				this.wait();
			}
			data = data + 1;
			System.out.println("data +++++++++++ " + data);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.notifyAll();
		}
	}
	
	public synchronized void decrement() {
		try {
			while(data <= 0) {
				this.wait();
			}
			data = data - 1;
			System.out.println("data ------ " + data);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.notifyAll();
		}
	}
	
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值