很久没上来了,看到学生学程序学得没意思,于是就突发其想写个有意思的程序,让学生深入了解,线程这东西对职高生来说,也的确是有点难度哦.
经过一番努力终点于写出来了.供需要找线程同步案例的朋友一起学习,交流
1,写了一个Accout的银行账户类,代码如下:
package ch11;
public class Accout
{
/**
* 账户名
*/
String name;
/**
* 账号余额
*/
double money;
/**
* 存钱操作常量
*/
static final int save=0;
/**
* 取钱操作常量
*/
static final int sub=1;
/**
* 账号操作方式
*/
int x;
Accout(){};//无参数的构造函数
/**
* 要操作的数
*/
double number;//要操作的数
Accout(String name,double x)
{
this.name=name;
this.money=x;
}
/**
* 设置要操作的钱的值
* @param number 对账号操作的数目
*/
public void setNumber(double number)
{
this.number=number;
}
/**
* 获取操作账号的数目
* @return 操作账号的数目
*/
public double getNumber()
{
return number;
}
/**
* 设置操作账号的方式
* @param x 设置操作账号的方式
* x :1 取钱
* x: 0 存钱
*/
public void setOp(int x)
{
this.x=x;
}
/**
* 获得账号操作方式
* @return 返回操作账号的方式
*/
public int getOp()
{
return x;
}
/**
* 返回账号余额
* @return 账号余额
*/
public double getMoney()
{
return money;
}
/**
* 设置账号余额
* @param money 账号余额
*/
public void setMoney(double money)
{
this.money = money;
}
/**
* 获取账号名
* @return 开户名
*/
public String getName()
{
return name;
}
/**
* 设置账号名
* @param name 账号名
*/
public void setName(String name)
{
this.name = name;
}
/**
* 相应账号的操作过程
*/
public
synchronized void op()
{//如果是存钱,那么就把存的钱加入到账户
if(getOp()==save)
{
setMoney(getMoney()+this.getNumber());
System.out.println("存钱成功,现在账号上有:"+getMoney());
}
//取钱
if(getOp()==sub)
{
if(this.number>getMoney())//1.选判断账号是否有足够余额
throw new ArithmeticException("账户余额不足账户余额:"+getMoney());
else
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}//扣除相应操作数
setMoney(this.getMoney()-this.getNumber());
System.out.println(Thread.currentThread().getName()+"你取到"+this.getNumber()+"元\n"+"帐户余额:"+this.getMoney());
}
}
}
}
2.写了一个模拟运行测试的类.代码如下:
package ch11;
public class AccoutUser implements Runnable
{
Accout a;
AccoutUser(Accout a,double x)
{
this.a=a;
a.setNumber(x);
}
public void run()
{
a.op();
}
public static void main(String[] args)
{
Accout a=new Accout("你",3000);
a.setOp(Accout.sub);
AccoutUser au1=new AccoutUser(a,2000);
Thread t1=new Thread(au1,"你");
Thread t2=new Thread(au1,"你老婆");
t1.start();
t2.start();
}
}
编译运行,将Accout类中为红色的去掉会产生不同的效果,能很好的演示线程同步问题
分享到:
相关推荐
本文主要介绍了Java 多线程同步问题完整代码,以银行取钱为例,通过代码实例来演示多线程同步问题的解决方案。多线程同步是指在同一程序中有多个顺序流在执行,并且这些顺序流之间需要共享资源或数据。 在操作系统...
在Java编程领域,ATM(Automated Teller...总之,"java ATM存取一体机(线程同步互斥)"项目旨在通过模拟ATM操作来教授Java中的线程同步和互斥原理,这有助于开发者理解如何在实际应用中保证并发代码的正确性和安全性。
在Java中,我们可以使用`synchronized`关键字来实现线程同步。在这个实验中,我们定义了一个`sum`类来存储账户余额,`save`类代表存钱操作,`get`类代表取钱操作。 在`save`类的`run`方法中,我们使用`synchronized...
4. **线程同步**:为了避免多线程环境中的数据竞争问题,Java提供了`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法以及`ReentrantLock`等同步机制。 5. **线程池**:通过`ExecutorService`和`...
在Java编程中,多线程同步是一个核心概念,用于确保多个线程访问共享资源时的正确性。本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **...
为了保证数据的一致性和避免竞态条件(多个线程同时访问同一资源导致数据不一致),我们需要使用同步机制,如Java的`synchronized`关键字或`java.util.concurrent`包中的工具类。 在这个特定的场景中,仓库被实现为...
生产者与消费者问题是经典的线程同步问题之一,它模拟了两个不同角色(生产者和消费者)对共享资源的访问。在这个问题中,生产者负责生成数据并放入一个有限的缓冲区,而消费者则从这个缓冲区取出数据进行消费。为了...
银行账户的存取款线程设计银行账户的存取款线程设计
Java聊天系统是一个典型的多线程应用,用于模拟实际网络环境中用户间的实时通信。在这个项目中,你可以深入理解并实践Java的多线程编程技术。多线程编程是Java编程中的重要概念,它允许程序同时执行多个任务,提高...
### Java常用语句大全及Java编码规范模拟测验解析 #### 集合类的使用规范 1. **集合类的命名原则** - 正确做法:含有集合意义的属性命名,尽量包含其复数的意义。例如,存储员工信息的列表可以命名为`employees`...
这种系统可以帮助开发者学习Java语言的多线程编程和同步机制。 多线程编程 在Java实现银行存取款系统中,使用了多线程编程来模拟多个用户同时进行存取款操作。多线程编程可以提高系统的并发性和响应速度。Java语言...
同时,为了保证数据的一致性和完整性,应当使用同步控制,防止多线程环境下数据的混乱。 总的来说,这个项目是学习和实践Java IO流的一个好例子。它不仅锻炼了文件操作的能力,还涉及到基础的账户管理和交易逻辑,...
【Java小项目-银行管理系统】是一个综合性的编程实践,它结合了GUI图形用户界面与文件读写功能,为用户提供了一种模拟银行日常运营的简单工具。在这个系统中,开发者使用Java语言来实现各项功能,包括账户管理、存款...
6. **LinkedList 和 ArrayList 作为 Stack**:虽然 Java 提供了 Stack 类,但在某些情况下,我们也可以使用 LinkedList 或 ArrayList 来模拟栈的行为,通过它们的 addFirst()、removeFirst() 方法来实现先进后出...
- **线程的同步**:解释线程同步的重要性以及如何使用`synchronized`关键字避免并发问题。 - **线程间的交互**:探讨线程之间如何进行通信,例如使用`wait()`、`notify()`等方法。 - **Java2SDK中的线程控制**:学习...
生产者与消费者问题是操作系统中经典的进程同步问题,它模拟了多线程环境下资源的共享与协作。在这个案例中,我们以会计与出纳的工作过程为例,来解释这个问题的解决策略。 首先,会计与出纳分别代表了生产者和消费...
实例172 银行自动存取一体机 278 9.4 多态 284 实例173 饮食文化 284 实例174 使用构造方法的重载计算课程的GPA值 287 第10章 内部类与接口(教学视频:41分钟) 290 10.1 成员内部类 290 ...
**重要性**: 线程同步是多线程编程中的关键部分,它确保了数据的一致性和程序的正确执行。 **常见方法**: 1. **wait()**: 使一个线程进入等待状态,并释放对象的锁。调用该方法的线程必须持有该对象的锁。 2. **...
实例233 ATM存取一体机(线程同步互斥) 437 实例234 我的钱哪里去了 440 实例235 门锁打不开了(死锁) 444 实例236 门锁终于被打开了(解决死锁) 446 实例237 一个死锁的例子 448 13.3 线程的优先级 451 实例238 ...