模擬實作多執行緒處理銀行的實時轉賬交易,假設銀行有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
uj5u.com熱心網友回復:
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+"");
}
}
}
uj5u.com熱心網友回復:
樓主問題解決了嗎轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/47842.html
標籤:Java相關
上一篇:什么是glob
