?? bang.java
字號:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestMain5 extends JFrame {
private Accounts accounts = null; // 我的帳號
private JTextField text = null; // 銀行存款數(shù)額顯示
private JTextArea textArea = null; // 交易過程顯示
private JButton button = null; // 開始模擬交易的按鈕
public TestMain5(){
super("銀行存取模擬");
accounts = new Accounts();
text = new JTextField(Integer.toString(accounts.inquire()), 10); // 我們在銀行中的初始存款為100
textArea = new JTextArea();
textArea.setText("交易信息:");
JScrollPane sp = new JScrollPane(textArea);
button = new JButton("開始交易");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
new Bank("鐘樓支行", accounts, Bank.SAVE, 800);
new Bank("高新支行", accounts, Bank.SAVE, 1300);
new Bank("小寨支行", accounts, Bank.WITHDRAWAL, 200);
new Bank("雁塔支行", accounts, Bank.WITHDRAWAL, 400);
new Bank("興慶支行", accounts, Bank.SAVE, 100);
new Bank("土門支行", accounts, Bank.WITHDRAWAL, 700);
}
});
JPanel pane = new JPanel();
pane.add(text);
pane.add(button);
this.getContentPane().add(pane, BorderLayout.NORTH);
this.getContentPane().add(sp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 200);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
/**
* 銀行交易大廳類
* 一般銀行都會有N個交易大廳,這些大廳可以同時處理多筆業(yè)務(wù),這正好符合多線程的特點(diǎn)
*/
class Bank extends Thread{
/**
* 靜態(tài)字段:用于表示儲存
*/
public static final int SAVE = 0;
/**
* 靜態(tài)字段:用于表示提取
*/
public static final int WITHDRAWAL = 1;
private int deal = Bank.WITHDRAWAL; // 默認(rèn)使取款
private int count = 0;
private Accounts accounts = null; // 我的帳號
/**
* 構(gòu)造這個銀行交易大廳
* name: 這個交易大廳的名稱
* Accounts: 我的銀行帳號
* deal: 行為,參考字段:SAVE或WITHDRAWAL
* count: 錢的數(shù)量
*/
public Bank(String name, Accounts accounts, int deal, int count){
super(name);
this.accounts = accounts;
this.deal = deal;
this.count = count;
this.start();
}
public void run(){
int counted = 0;
if(deal == Bank.SAVE){ // 如果是存款業(yè)務(wù)
counted = accounts.save(count);
}else if(deal == Bank.WITHDRAWAL){ // 如果是取款業(yè)務(wù)
counted = accounts.withdrawal(count);
}
text.setText(Integer.toString(counted));
textArea.append("\n" + this.getName() + " " + (deal == Bank.SAVE ? "存款": "取款") + " 金額:" + count + " 結(jié)余:" + counted);
}
}
/**
* 我的帳號
* 進(jìn)行同步測試
*/
class Accounts{
private Integer count = 100;
public Accounts(){
}
/**
* 查詢我的帳號
*/
public int inquire(){
synchronized (count){
return count;
}
}
/**
* 存款業(yè)務(wù)
* @param c 存款的數(shù)量
* @return 業(yè)務(wù)辦理完成后的數(shù)量
*/
public int save(int c){
synchronized (count){
//return count += c; // 為了能更好的觀察,我們將這個簡潔的語句注釋掉
int counted = inquire(); // 先查詢帳戶中的存款
counted += c;
try {
Thread.sleep(1000); // 為了更好的觀察,使業(yè)務(wù)在此停頓1秒鐘
} catch (InterruptedException ex) {
ex.printStackTrace();
}
count = counted; // 最后將總數(shù)儲存起來
return inquire(); // 返回最新的存款數(shù)
}
}
/**
* 取款業(yè)務(wù)
* @param c 取款的數(shù)量
* @return 業(yè)務(wù)辦理完成后的數(shù)量
*/
public int withdrawal(int c){
synchronized (count){
//return count -= c; // 為了能更好的觀察,我們將這個簡潔的語句注釋掉
int counted = inquire(); // 先查詢帳戶中的存款
counted -= c;
try {
Thread.sleep(1000); // 為了更好的觀察,使業(yè)務(wù)在此停頓1秒鐘
} catch (InterruptedException ex) {
ex.printStackTrace();
}
count = counted; // 最后將總數(shù)儲存起來
return inquire(); // 返回最新的存款數(shù)
}
}
}
public static void main(String [] args){
new TestMain5();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -