執行緒例項模仿人在銀行取錢
阿新 • • 發佈:2019-01-03
package thread;
public class Bank{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bank(String name) {
super();
this.name = name;
}
// 一個賬戶有2000塊錢
static int money = 2000;
// 櫃檯取錢的方法
public void Counter(int money) {//每次取走的錢數
Bank.money -= money;//取錢後總額減少
}
// ATM取錢的方法
public void ATM(int money) {//每次取走的錢數
Bank.money -= money;//取錢後總額減少
}
private static String[] shareObj = {"true"}; // 建立一個靜態鑰匙//可以任意定義
static class PersonA extends Thread {
// 建立銀行物件
Bank bank;
//通過構造器傳入銀行物件,確保兩個人進入的是一個銀行
public PersonA(Bank bank, String name) {
super(name);
this.bank = bank;
}
//重寫run方法,在裡面實現使用櫃檯取錢
@Override
public void run() {
synchronized (shareObj) {// 這個很重要屬於銀行的取款號碼,一個人完成下一個人才能使用櫃檯取款
while (Bank.money >= 100) {
int money = 100;
bank.Counter(money);// 每次取100塊
System.out.println(this.getName()+"在"+bank.getName()+"取走了" +money + "還剩下" +(Bank.money));
try {
shareObj.wait();//櫃檯工作人員暫停服務!
} catch (InterruptedException e) {
e.printStackTrace();
}
if(Bank.money==0){
System.err.println("不好意思銀行暫時沒有現金了!");
break;
}
try {
sleep(1000);//取完櫃檯工作人員休息1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class PersonB extends Thread{
// 建立銀行物件
Bank bank;
// 通過構造器傳入銀行物件,確保兩個人進入的是一個銀行
public PersonB(Bank bank, String name) {
super(name);
this.bank = bank;
}
// 重寫run方法,在裡面實現使用櫃檯取錢
@Override
public void run() {
synchronized (shareObj) {
while (Bank.money >= 200) {
int money = 200;
bank.ATM(money);// 每次取200塊
System.out.println(this.getName()+"在"+bank.getName()+"取走了" + money + "還剩下" +(Bank.money));
shareObj.notifyAll();
if(Bank.money==0){
System.err.println(this.getName()+"在"+bank.getName()+"把剩餘的錢取完了!");
break;
}
try {
sleep(1000);// ATM反應1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
//三個人在銀行取錢
public static void main(String[] args) {
//銀行的櫃檯
Bank bank1 = new Bank("銀行櫃檯");
//銀行的取款機
Bank bank2 = new Bank("銀行ATM機");
// 例項化三個人,在同一個銀行取錢
PersonA pA = new PersonA(bank1,"A");
PersonA PA2 = new PersonA(bank1,"B");
PersonB pB = new PersonB(bank2,"C");
//pA和PA2在櫃檯排隊取錢:PB在ATM機取錢
pA.start();
PA2.start();
pB.start();
}
}
}
public class Bank{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bank(String name) {
super();
this.name = name;
}
// 一個賬戶有2000塊錢
static int money = 2000;
// 櫃檯取錢的方法
public void Counter(int money) {//每次取走的錢數
Bank.money -= money;//取錢後總額減少
}
// ATM取錢的方法
public void ATM(int money) {//每次取走的錢數
Bank.money -= money;//取錢後總額減少
}
private static String[] shareObj = {"true"}; // 建立一個靜態鑰匙//可以任意定義
static class PersonA extends Thread {
// 建立銀行物件
Bank bank;
//通過構造器傳入銀行物件,確保兩個人進入的是一個銀行
public PersonA(Bank bank, String name) {
super(name);
this.bank = bank;
}
//重寫run方法,在裡面實現使用櫃檯取錢
@Override
public void run() {
synchronized (shareObj) {// 這個很重要屬於銀行的取款號碼,一個人完成下一個人才能使用櫃檯取款
while (Bank.money >= 100) {
int money = 100;
bank.Counter(money);// 每次取100塊
System.out.println(this.getName()+"在"+bank.getName()+"取走了" +money + "還剩下" +(Bank.money));
try {
shareObj.wait();//櫃檯工作人員暫停服務!
} catch (InterruptedException e) {
e.printStackTrace();
}
if(Bank.money==0){
System.err.println("不好意思銀行暫時沒有現金了!");
break;
}
try {
sleep(1000);//取完櫃檯工作人員休息1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class PersonB extends Thread{
// 建立銀行物件
Bank bank;
// 通過構造器傳入銀行物件,確保兩個人進入的是一個銀行
public PersonB(Bank bank, String name) {
super(name);
this.bank = bank;
}
// 重寫run方法,在裡面實現使用櫃檯取錢
@Override
public void run() {
synchronized (shareObj) {
while (Bank.money >= 200) {
int money = 200;
bank.ATM(money);// 每次取200塊
System.out.println(this.getName()+"在"+bank.getName()+"取走了" + money + "還剩下" +(Bank.money));
shareObj.notifyAll();
if(Bank.money==0){
System.err.println(this.getName()+"在"+bank.getName()+"把剩餘的錢取完了!");
break;
}
try {
sleep(1000);// ATM反應1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
//三個人在銀行取錢
public static void main(String[] args) {
//銀行的櫃檯
Bank bank1 = new Bank("銀行櫃檯");
//銀行的取款機
Bank bank2 = new Bank("銀行ATM機");
// 例項化三個人,在同一個銀行取錢
PersonA pA = new PersonA(bank1,"A");
PersonA PA2 = new PersonA(bank1,"B");
PersonB pB = new PersonB(bank2,"C");
//pA和PA2在櫃檯排隊取錢:PB在ATM機取錢
pA.start();
PA2.start();
pB.start();
}
}
}