マルチスレッドのwaitとnotify
2440 ワード
以下のマルチスレッドの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
ユーザーはまず消費し、銀行はメッセージを送信します.