多线程银行转账的代码,求帮助

MBT_Steven 2018-04-22 05:35:34
模拟实现多线程处理银行的实时转账交易,假设银行有20个账户,每个账户均有本金1000元,程序将实现各个账号之间不同金额的转账交易。要求如下:
(1) 主线程从一个文件中读取交易信息,交给多个子线程处理,每个子线程负责处理一个交易。主线程和多个子线程之间通信方式基于生产者/消费者模型采用ArrayBlockingQueue实现。
创建一个文件保存大量交易信息(至少100条),一行表示一条交易,格式如下:
10 25 2500
表示将2500元从账号10转到了账号25。
提示:主线程把最后一条交易信息放在Queue里后,应采用适当的方式告知子线程,比如最后一条交易可以设定为(-1,0,0),子线程不能用null来判断Queue是否为空)。
(2) 建议创建如下几个类:
账户Account:包括账号ID,当前余额Balance、已交易次数TransanctionNum。
银行Bank:包括所有账户和保存主线程和子线程之间交易信息的ArrayBlockingQueue。
(3) 子线程数量可作为参数传入,或者采用用户从键盘输入形式。
运行结果应显示所有账户信息,按照升序排列的账号、当前余额、交易次数。
运行结果示例如下:
请输入线程数量:
10
acct:01 bal:251 trans:1
acct:02 bal:999 trans:1
acct:03 bal:3005 trans:1
acct:04 bal:1200 trans:1
acct:05 bal:1985 trans:1




下面是txt文件
1 2 425
1 6 125
5 7 161
8 15 421
4 3 210
3 4 253
1 9 79
8 13 180
10 1 325
20 1 500
11 2 321
5 16 48
6 17 293
12 20 20
14 11 346
16 5 73
4 18 222
3 19 134
7 6 74
-1 -1 -1
...全文
1050 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sven scuM 2020-06-25
  • 打赏
  • 举报
回复
楼主问题解决了吗
MBT_Steven 2018-04-22
  • 打赏
  • 举报
回复
package lightprocess; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; class Trans{ int idf; int idt; int trmoney; public Trans(int idf,int idt,int trmoney) { this.idf=idf; this.idt=idt; this.trmoney=trmoney; } } class Account { int ID,Balance,TransanctionNum; public Account(int ID,int Balance,int TransanctionNum) { this.Balance=Balance; this.ID=ID; this.TransanctionNum=TransanctionNum; } public String toString() { return "acct:"+ID+" bal:"+Balance+" trans"+TransanctionNum; } } public class Bank implements Runnable{ BlockingQueue<Trans>tran; String fileName="D:\\中间件技术\\transform.txt"; static int [][] shuju=new int[21][3]; public Bank (BlockingQueue<Trans>tran) { this.tran=tran; } static class sonThread implements Runnable{ BlockingQueue<Trans>tran; ArrayList<Account>acc=new ArrayList<Account> (21); public sonThread(BlockingQueue<Trans>tran,ArrayList<Account>acc) { this.acc=acc; this.tran=tran; } public void run() { try { boolean flag=true; while(flag) { int money; Trans t=tran.take(); money=t.trmoney; if(t.idf!=-1) { acc.get(t.idf).Balance=acc.get(t.idf).Balance-money; acc.get(t.idt).Balance=acc.get(t.idt).Balance+money; acc.get(t.idf).TransanctionNum++; acc.get(t.idt).TransanctionNum++; } else { flag=false; } } }catch(InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } } } public void run(){ try { String fileName="D:\\中间件技术\\transform.txt"; int [][] shuju=new int[20][3]; System.out.println(Thread.currentThread().getName() + "正在启动。。"); String st=null; int line=0; BufferedReader br = new BufferedReader(new FileReader(fileName)); st=br.readLine(); while(st!=null) { String s[]=st.split(" "); for(int i=0;i<3;i++) { shuju[line][i]=Integer.parseInt(s[i].trim()); } tran.put(new Trans(shuju[line][0],shuju[line][1],shuju[line][2])); line++; st=br.readLine(); } br.close(); }catch(IOException e1) { e1.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { ArrayList<Account> account=new ArrayList<Account> (20); for(int x=0;x<21;x++) { Account ac=new Account(x,1000,0); account.add(ac); } BlockingQueue<Trans> trans = new ArrayBlockingQueue<Trans>(10); Scanner sc=new Scanner(System.in); System.out.print("请输入线程数:"); int n=sc.nextInt(); System.out.println(""); Bank bank=new Bank(trans); sonThread sT=new sonThread(trans,account); new Thread(bank).start(); for(int i=0;i<n;i++) { new Thread(sT,"sonThread"+(i+1)).start(); } for(int i=0;i<20;i++) {; System.out.println("acct:"+account.get(i).ID+" bal:"+account.get(i).Balance+" trans:"+account.get(i).TransanctionNum+""); } } }

50,449

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧