线程间写作练习

模拟银行账户取钱问题

账户类

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Accout{
private Lock lock=new ReentrantLock(true); 
private Condition am=lock.newCondition();
private int a=0;
public int geta() {
	return a;
}
public  void jia(int b)
{lock.lock();
	a+=b;
	System.out.println("存钱成功");
	am.signalAll();//唤醒取钱失败的所有进程
	lock.unlock();
	}
public void jian(int b) 
{lock.lock();
try {
	while(a<b)
	{System.out.println("余额不足,取钱失败");
	am.await();}//余额不足,等待存钱进程执行完后在执行
	a-=b;
	System.out.println("取钱成功");
	}
catch (InterruptedException e) {
	// TODO 自动生成的 catch 块
	e.printStackTrace();
}
lock.unlock();
	}
}

在这里插入代码片

取钱线程类

public class B implements Runnable{
	private Accout a;
	private int b;
	 public B(Accout a,int b)
	 {this.a=a;
	 this.b=b;}
	 public void run() {
		
			a.jian(b);
			 }
}
在这里插入代码片

存钱线程类

public class A implements Runnable{
	private Accout a;
	private int b;
	 public A(Accout a,int b)
	 {this.a=a;
	 this.b=b;}
	 public void run() {
		a.jia(b);
			 }
	 }
在这里插入代码片

测试类

public class my {
	static Accout a=new Accout();
	public static void main(String []args) {
	ExecutorService am=Executors.newFixedThreadPool(3);
	am.execute(new A(a,20));
	am.execute(new B(a,30));
	am.shutdown();
}}
在这里插入代码片

测试结果
在这里插入图片描述

发布了130 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/feiqipengcheng/article/details/103616690