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
相关产品推荐
相关产品推荐

