java多线程实现取款小程序

下面是针对Java多线程实现取款小程序的完整攻略。

准备工作

在开始之前,我们需要先了解一些Java多线程方面的基础知识,如线程创建与启动、线程同步、线程通信等。这些知识我们可以通过阅读相关的书籍或者在线教程来学习掌握。

实现步骤

  1. 创建一个银行账户类,包括账户余额、账户号码等属性,以及存、取款等方法。
public class Account {
    private String accountNo;//账户号码
    private double balance;//账户余额
    //省略构造方法、setter和getter方法
    //存款操作
    public synchronized void deposit(double money) {
        balance += money;
        System.out.println(Thread.currentThread().getName() + " 存款 " + money + " 成功,账户余额为:" + balance);
    }
    //取款操作
    public synchronized void withdraw(double money) {
        if (balance >= money) {
            balance -= money;
            System.out.println(Thread.currentThread().getName() + " 取款 " + money + " 成功,账户余额为:" + balance);
        } else {
            System.out.println(Thread.currentThread().getName() + " 取款 " + money + " 失败,余额不足!");
        }
    }
}

在存款和取款操作中,我们使用了synchronized关键字来实现同步,在执行存款或取款操作时,需要对当前的账户对象进行加锁,保证同一时间只有一个线程能够对该账户进行操作。

  1. 创建多个线程进行取款和存款操作。为了更好地展现账户余额的变化,我们可以设置取款和存款线程具有不同的优先级。
public static void main(String[] args){
    Account account = new Account("001", 1000);
    Thread depositThread1 = new Thread(new DepositThread(account), "存款线程1");
    Thread depositThread2 = new Thread(new DepositThread(account), "存款线程2");
    Thread withdrawThread1 = new Thread(new WithdrawThread(account), "取款线程1");
    Thread withdrawThread2 = new Thread(new WithdrawThread(account), "取款线程2");
    depositThread1.setPriority(Thread.MAX_PRIORITY);
    depositThread2.setPriority(Thread.MAX_PRIORITY);
    withdrawThread1.setPriority(Thread.MIN_PRIORITY);
    withdrawThread2.setPriority(Thread.MIN_PRIORITY);
    depositThread1.start();
    depositThread2.start();
    withdrawThread1.start();
    withdrawThread2.start();
}

//存款线程
class DepositThread implements Runnable{
    private Account account;

    public DepositThread(Account account) {
        this.account = account;
    }

    @Override
    public void run() {
        for(int i=0;i<100;i++){
            account.deposit(10);
        }
    }
}

//取款线程
class WithdrawThread implements Runnable{
    private Account account;

    public WithdrawThread(Account account) {
        this.account = account;
    }

    @Override
    public void run() {
        for(int i=0;i<100;i++){
            account.withdraw(10);
        }
    }
}

运行程序后,我们可以看到如下结果:

存款线程1 存款 10.0 成功,账户余额为:1010.0
取款线程1 取款 10.0 成功,账户余额为:1000.0
存款线程1 存款 10.0 成功,账户余额为:1010.0
取款线程2 取款 10.0 成功,账户余额为:1000.0
存款线程1 存款 10.0 成功,账户余额为:1010.0
...

我们可以看到,存款和取款操作依次进行,余额也在正常变化。

  1. 添加取款上限,避免账户余额小于0的情况发生。如果账户余额小于0,则将当前线程阻塞,直到其他线程存款为止。
public synchronized void withdraw(double money) {
    if (balance >= money) {
        balance -= money;
        System.out.println(Thread.currentThread().getName() + " 取款 " + money + " 成功,账户余额为:" + balance);
    } else {
        System.out.println(Thread.currentThread().getName() + " 取款 " + money + " 失败,余额不足!");
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public synchronized void deposit(double money) {
    balance += money;
    System.out.println(Thread.currentThread().getName() + " 存款 " + money + " 成功,账户余额为:" + balance);
    notifyAll();
}

在取款操作中,如果发现账户余额不足,则使用wait()将当前线程阻塞,等待其他线程进行存款操作。在存款操作中,我们使用notifyAll()方法来唤醒之前被阻塞的线程,让它们继续执行。这种方式可以避免账户余额小于0的情况发生。

  1. 实现一个定时器,每隔一段时间自动进行存款操作。例如,我们可以设置每隔10秒钟,自动向账户存入100元。
class AutoDepositTask extends TimerTask {
    private Account account;

    public AutoDepositTask(Account account) {
        this.account = account;
    }

    @Override
    public void run() {
        account.deposit(100);
    }
}

public static void main(String[] args){
    Account account = new Account("001", 1000);
    Timer timer = new Timer();
    timer.schedule(new AutoDepositTask(account), 0, 10000);
    ...
}

我们创建了一个AutoDepositTask类,继承了TimerTask类,并重写了其中的run()方法,用于执行自动存款的操作。在main()方法中,创建了一个Timer对象,并使用schedule()方法设置了定时任务的执行方式。

示例说明

  1. 多个线程同时对同一个账户进行存款和取款操作。由于在存款和取款操作中实现了同步,各线程对账户进行的操作互不干扰,保证了线程安全。
  2. 当余额不足时,取款线程被阻塞。在使用wait()方法将当前线程阻塞时,我们还需要进行异常处理,以保证程序的健壮性。同时,在存款线程中使用notifyAll()唤醒线程时,需要使用同步方法或同步代码块来保证线程安全。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多线程实现取款小程序 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • idea中的Maven导包失败问题解决方案汇总

    下面我将详细讲解 “idea中的Maven导包失败问题解决方案汇总”的完整攻略,具体步骤如下: 1. 清理缓存 如果Maven导包失败,可以先尝试清理Maven的缓存: 依次点击File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven -> …

    Java 2023年5月20日
    00
  • java中的FileInputStream(输入流)

    Java中的FileInputStream是一种输入流,用于读取文件中的二进制数据或者字符数据。以下是详细的攻略: 1. FileInputStream的初始化 初始化FileInputStream需要提供文件路径作为输入参数,示例代码如下: FileInputStream fis = new FileInputStream("path/to/fi…

    Java 2023年5月26日
    00
  • java实现计算器加法小程序(图形化界面)

    Java实现计算器加法小程序(图形化界面) 本文将详细讲解如何使用Java语言实现一个基本的计算器加法小程序,并提供代码示例说明。以下是完整的攻略: 步骤一:创建项目 首先,我们需要创建一个Java项目,并将其命名为“calculator”。 步骤二:添加图形用户界面 我们将会使用Java Swing库来添加图形用户界面(GUI)。 我们可以通过创建一个JF…

    Java 2023年5月23日
    00
  • SpringBoot yaml语法与JRS303校验超详细讲解

    下面是关于SpringBoot yaml语法与JRS303校验的完整攻略: 什么是SpringBoot yaml语法 yaml 是一种面向人类的通用数据序列化格式,被广泛地应用于各类编程语言中。在SpringBoot中,yaml语法被用来配置应用程序的属性,更具有可读性、易用性和可维护性。 下面是一个简单示例: server: port: 8080 spri…

    Java 2023年6月2日
    00
  • Spring Boot中使用Spring Retry重试框架的操作方法

    Spring Boot中使用Spring Retry重试框架的操作方法 Spring Retry是一个轻量级的重试框架,可以帮助我们处理应用程序中的重试逻辑。在本文中,我们将详细讲解如何在Spring Boot应用程序中使用Spring Retry。 步骤一:添加依赖 我们需要在pom.xml文件中添加以下依赖项: <dependency> &l…

    Java 2023年5月15日
    00
  • Ajax读取数据之分页显示篇实现代码

    Ajax是一种在Web应用程序中创建异步请求的技术。本篇攻略将演示如何使用Ajax读取数据并分页显示。 实现步骤 1.后端:编写接口,提供数据。 2.前端:使用Ajax从后端读取数据并展示。 3.前端:实现分页逻辑。 下面是这些步骤的详细说明。 编写接口 我们需要提供一个接口来获取数据。可以使用PHP、Java或任何其他后端编程语言编写接口。下面是一个使用P…

    Java 2023年6月15日
    00
  • JAVA复制数组和重置数组大小操作

    JAVA复制数组操作 1. System.arraycopy() 该方法可以用来复制一个数组到另一个数组。 语法: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:源数组 srcPos:源数组起始位置 dest:目标数…

    Java 2023年5月26日
    00
  • 你可能真没用过这些 IDEA 插件(建议收藏)

    当提到Java开发的工具中,IntelliJ IDEA是无疑是许多开发者首选的IDE。除了强大的功能之外,IDE在安装插件后可以帮助我们更快速的开发,提高工作效率。在本篇攻略中,我将介绍一些我平常在IDEA中常用的插件,并提供一些示例。 一、安装插件 安装插件非常简单,只需要打开IDEA选项,然后点击插件,再找到Marketplace页面,在这里面你能找到很…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部