I have created 3 classes,
- class InCharge - Should check the current Balance, while checking
Client
thread shouldwait()
untilInCharge
thread finish the testing(15Secs) - Class Client - Should withdraw money each 5Seconds, but when
InCharge
Thread runningClient
thread should wait untilInCharge
thread saysNotify()
- class Bank - Which hold the current balance, and the lock for
Synchronized
block.
According to my debugging it's seem to be that InCharge
send the Notify()
but for some reason Client is not receiving the notice, I'm guessing that the problem is because while(true)
, but I cannot think of a way to solve it.
can you please help figure out the problem?
Main:
public class Main {
public static void main(String[] args) {
Object obj = new Object();
Bank bank = new Bank(100000);
Client client1 = new Client(obj, bank);
InCharge inCharge = new InCharge(obj, bank);
client1.setName("client1");
inCharge.setName("inCharge");
client1.start();
inCharge.start();
}
}
Bank:
public class Bank {
private int balance;
private boolean bankIsClose = false;
public Bank(int balance) {
this.balance = balance;
}
public int getBalance() {
return balance;
}
public boolean isBankIsClose() {
return bankIsClose;
}
public void setBankIsClose(boolean bankIsClose) {
this.bankIsClose = bankIsClose;
}
public void setBalance(int balance) {
this.balance = balance;
}
public synchronized void withdraw(String name, int amount){
if (this.balance - amount >= 0) {
this.balance = this.balance - amount;
System.out.println(name+" "+this.balance + " withdrawed - " + amount);
}
}
}
Client:
public class Client extends Thread {
private Object obj;
private Bank bank;
Client(Object obj, Bank bank) {
this.obj = obj;
this.bank = bank;
}
@Override
public void run() {
int randomNumber;
while (bank.getBalance() > 0) {
synchronized (obj) {
randomNumber = ((int) (Math.random() * (5000 - 1000 + 1)) + 1000);
if (!bank.isBankIsClose()) {
try {
obj.wait();
bank.withdraw(currentThread().getName(), randomNumber);
} catch (Exception e) {}
}
}
}
}
}
InCharge:
public class InCharge extends Thread {
private Object obj;
private Bank bank;
InCharge(Object obj, Bank bank) {
this.obj = obj;
this.bank = bank;
}
@Override
public void run() {
while (true) {
synchronized (obj) {
bank.setBankIsClose(true);
try {
System.out.println("Charge is here!, current balance is: " + bank.getBalance());
Thread.sleep(5000);
} catch (InterruptedException e) {}
bank.setBankIsClose(false);
obj.notify();
}
}
}
}