You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现转账操作历史记录及参数延迟执行问题咨询

解决方案代码与说明

1. 定义转账记录实体类(用于操作历史)

import java.time.LocalDateTime;

public class TransferRecord {
    private String currentUser;
    private String targetUser;
    private int amount;
    private LocalDateTime timestamp;
    private boolean isExecuted;

    public TransferRecord(String currentUser, String targetUser, int amount, LocalDateTime timestamp, boolean isExecuted) {
        this.currentUser = currentUser;
        this.targetUser = targetUser;
        this.amount = amount;
        this.timestamp = timestamp;
        this.isExecuted = isExecuted;
    }

    // Getter方法
    public String getCurrentUser() { return currentUser; }
    public String getTargetUser() { return targetUser; }
    public int getAmount() { return amount; }
    public LocalDateTime getTimestamp() { return timestamp; }
    public boolean isExecuted() { return isExecuted; }
    public void setExecuted(boolean executed) { isExecuted = executed; }

    @Override
    public String toString() {
        return String.format("[%s] %s 转账 %d 元给 %s | 状态:%s",
                timestamp, currentUser, amount, targetUser, isExecuted ? "已执行" : "待执行");
    }
}

2. 修改核心业务类,实现历史记录与延后执行

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class BankService {
    private static Scanner scanner = new Scanner(System.in);
    private static int balance = 1000; // 示例初始余额
    private static String currentUser = "demo_user"; // 替换为实际当前登录用户
    private static List<TransferRecord> transferHistory = new ArrayList<>();
    private static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public static String moneyTransfer() {
        // 清除前一次输入残留的换行符
        scanner.nextLine();
        
        System.out.println("输入收款人用户名:");
        String targetUser = scanner.nextLine();

        System.out.println("输入转账金额:");
        int transferAmount = scanner.nextInt();

        // 记录操作历史(初始标记为待执行)
        TransferRecord record = new TransferRecord(currentUser, targetUser, transferAmount, LocalDateTime.now(), false);
        transferHistory.add(record);

        // 让用户选择延迟执行时间
        System.out.println("输入延迟执行秒数(输入0立即执行):");
        int delaySeconds = scanner.nextInt();

        // 提交延迟执行任务
        scheduler.schedule(() -> {
            if (balance >= transferAmount) {
                balance -= transferAmount;
                record.setExecuted(true);
                System.out.println("\n延迟转账完成:已转 " + transferAmount + " 元给 " + targetUser);
                System.out.println("当前余额:" + balance);
            } else {
                System.out.println("\n延迟转账失败:余额不足");
            }
        }, delaySeconds, TimeUnit.SECONDS);

        System.out.println("转账任务已提交,将在" + delaySeconds + "秒后执行");
        System.out.println("当前可用余额(未扣除待转金额):" + balance);

        // 修复无法终止问题:返回菜单标识,由外部循环控制流程
        return "menu";
    }

    // 查看转账历史
    public static void viewTransferHistory() {
        System.out.println("\n=== 转账操作历史 ===");
        for (TransferRecord tr : transferHistory) {
            System.out.println(tr);
        }
    }

    // 主菜单(用循环替代递归,解决无法终止问题)
    public static void startPanel() {
        while (true) {
            System.out.println("\n=== 银行操作菜单 ===");
            System.out.println("1. 转账");
            System.out.println("2. 查看转账历史");
            System.out.println("3. 退出");
            int choice = scanner.nextInt();

            switch (choice) {
                case 1:
                    moneyTransfer();
                    break;
                case 2:
                    viewTransferHistory();
                    break;
                case 3:
                    scheduler.shutdown();
                    System.out.println("已退出系统");
                    return;
                default:
                    System.out.println("无效选项,请重新输入");
            }
        }
    }

    public static void main(String[] args) {
        startPanel();
    }
}

关键实现说明

  • 操作历史记录:通过TransferRecord实体类存储转账的用户信息、金额、时间和执行状态,用静态列表transferHistory持久化记录,提供viewTransferHistory方法查看。
  • 延后执行逻辑:使用ScheduledExecutorService实现异步延迟任务,保存收款人、金额等参数后,延迟指定时间执行实际转账操作,避免阻塞主流程。
  • 修复无法终止问题:将原方法中递归调用startPanel()改为返回菜单标识,由startPanel中的循环控制流程,用户选择退出时可正常终止程序并关闭调度器,避免线程泄漏。

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:35:23