マルチスレッドの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


ユーザーはまず消費し、銀行はメッセージを送信します.