用一个简单的例子来详细的解释以下多线程中wait和notify
一个信用卡消费短信发送的例子,如果客户用信用卡进行了消费,那么银行就会发送一条短信告知用户。并且消费一定发生在发送短信之前,如果没有发生消费则不会发送短信。
这个情景里面出现了以下几个对象,因为java是面向对象编程,所以我们先弄清楚情景当中出现的对象。
银行,用户,信用卡
银行和用户都会调用信用卡,用户进行消费时,信用卡的余额减少,银行会根据信用卡消费记录发送给用户。
package com.erlong.TestWait;
import java.sql.Connection;
public class TestDemo04 {
public static void main(String[] args) {
Account account = new Account();
for (int i = 0; i < 10; i++) {
new Thread(new Bank(account)).start();
new Thread(new User(account)).start();
}
}
}
//做一个银行和用户的
//共享的资源是用户的账户
//用户先消费,银行再通知
class Account{
public int balance = 100;
public boolean flag = true;
}
class Bank implements Runnable{
private Account account;
Bank(Account account){
this.account =account;
}
@Override
public void run() {
SendMsg();
}
void SendMsg() {
synchronized (account) {
if(account.flag){
try {
account.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("银行发来短信说用户消费了");
account.flag = !account.flag;
account.notify();
}
}
}
class User implements Runnable{
private Account account;
User(Account account){
this.account =account;
}
@Override
public void run() {
Consume();
}
void Consume() {
synchronized (account) {
if(!account.flag){
try {
account.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("用户花钱了");
account.flag = !account.flag;
account.notify();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
结果:
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
用户花钱了
银行发来短信说用户消费了
Process finished with exit code 0
用户先进行消费,然后银行发送消息。