Java多執行緒練習一:銀行有一個賬戶,有兩個儲戶分別向同一個賬戶存3000元,每次存1000,存三次,每次存完列印賬戶余額(兩個儲戶交替存)
? 對于本題,需要有賬戶(Account)、儲戶(User)、以及一個測驗類(AccountTset)
? 可以分別用繼承Thread類和實作Runnable介面的方式來解決,同時需要注意執行緒同步的安全問題,
? 說明:用戶User需要共享一個賬戶Account,這時需要在User類中添加一個Account型別的屬性,以及為User類提供Account有參構造,以呼叫其存錢方法,同時在測驗類中也可保證不管new 多少個User都是共享同一個Account,
1.繼承Thread類的方法:
class Account {
//賬戶余額為money
private double money;
//有參構造器
public Account(double money) {
this.money = money;
}
//存錢方法
public void cunqian(double jine) {
if (jine > 0) {
//用同步代碼塊的方式解決執行緒安全問題,同步監視器為Account.class
synchronized (Account.class) {
Account.class.notify();
money += 1000;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-存款,賬戶余額為:" + money);
//
try {
Account.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class User extends Thread {
private Account account;
//有參構造器
public User(Account account) {
this.account = account;
}
//重寫run方法
@Override
public void run() {
for (int i = 0; i < 3; i++) {
account.cunqian(1000);
}
}
}
public class AccountTest {
public static void main(String[] args) {
Account acc = new Account(0);
//創建兩個User物件 (兩個執行緒)
User u1 = new User(acc);
User u2 = new User(acc);
//為兩個物件(執行緒)命名
u1.setName("甲");
u2.setName("乙");
u1.start();
u2.start();
}
}
2.實作Runnable介面:
? 說明: ReentrantLock lock = new ReentrantLock(true);在公平鎖(引數為true)中,執行緒執行完會讓出cpu執行權給下一個排隊的執行緒,而非公平鎖(引數為false或五引數)對鎖的獲取是亂序的,
class Account {
private double money;
實體化ReentrantLock,公平鎖
ReentrantLock lock = new ReentrantLock(true);
public Account(double money) {
this.money = money;
}
public void cunqian(double jine) {
if (jine > 0) {
lock.lock();
money += jine;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-存款,賬戶余額為:" + money);
}
lock.unlock();
}
}
class User implements Runnable {
private Account account;
public User(Account account) {
this.account = account;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
account.cunqian(1000);
}
}
}
public class AccountTest {
public static void main(String[] args) {
Account acc = new Account(0);
User user = new User(acc);
Thread t1 = new Thread(user);
Thread t2 = new Thread(user);
t1.setName("甲");
t2.setName("乙");
t1.start();
t2.start();
}
}
趙大海看完能不能發把ju?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255121.html
標籤:其他
