001
002 /**
003 * Konto version B.
004 * Uses synchronized methods to display, add and remove money
005 * from the account, account cannot become negative.
006 * @author Heinz Kredel.
007 */
008 public class KontoB implements Konto {
009
010 private double stand; // Konto Stand
011
012 public KontoB() { stand = 0.0; } // sets Kontostand to desired value
013
014 public KontoB(double a) { stand = a; }
015
016 /**
017 * Displays account balance.
018 * @return stand.
019 */
020 public synchronized double zeigeGeld() { return stand; }
021
022 /**
023 * Transfers amount to this account.
024 * Blocks if account would become negative.
025 * @param b amount to put on account.
026 * @return s returns actual balance from account.
027 */
028 public synchronized double putGeld(double b) { // stand += b
029 double s = stand + b;
030 WorkB.schaffen(100);
031 // nur falls s >= 0
032 while (s < 0 && stand > s) {
033 try {
034 this.wait();
035 } catch(InterruptedException e) { }
036 s = stand + b;
037 }
038 if (s >= 0 || s > stand) this.notify();
039 stand = s;
040 return s;
041 }
042
043
044 /**
045 * New account balance gets calculated and returned.
046 * Blocks if account would become negative.
047 * @param b amount to remove from desired account.
048 * @return s current account balance.
049 */
050 public synchronized double getGeld(double b) { // stand -= b
051 double s = stand - b;
052 WorkB.schaffen(100);
053 // nur falls s >= 0
054 while (s < 0 && stand > s) {
055 try {
056 this.wait();
057 } catch(InterruptedException e) { }
058 s = stand - b;
059 }
060 if (s >= 0 || s > stand) this.notify();
061 stand = s;
062 return s;
063 }
064
065 }
066
067
068 /**
069 * sending current thread to sleep for a random time.
070 */
071 class WorkB {
072
073 /**
074 * @param max defines range of numbers for Math.random().
075 */
076 public static void schaffen(int max) {
077 try {
078 Thread.currentThread().sleep( (int)(max*Math.random()) );
079 } catch (InterruptedException e) {
080 System.out.println("Dies sollte nicht passieren "+e);
081 }
082 }
083 }