001 //package edu.unima.ky.parallel; 002 003 /** 004 * Buchung. 005 * Multi threaded finance testing application for the "Bounded Buffer" 006 * generates random transfer amount within desired range. 007 * @author Heinz Kredel. 008 */ 009 public class Buchung { 010 011 /** 012 * Main method. 013 * @param args 014 * @throws InterruptedException 015 */ 016 public static void main(String[] args) throws InterruptedException { 017 018 int anzahl = 100; // number of iterations 019 int kanzahl = 10; // number of accounts 020 BoundedBuffer buffer = new BoundedBuffer(10); // Buffers are generated here. 021 KontoA[] konten = new KontoA[kanzahl]; 022 double balance = 0.0; 023 double stand; 024 for (int i = 0; i < konten.length; i++ ) { 025 konten[i] = new KontoA( 0.0 ); 026 stand = konten[i].zeigeGeld(); 027 balance += stand; 028 System.out.println("Konto " + i 029 + " Stand " + stand); 030 } 031 System.out.println("Balance " + balance); 032 033 034 Thread t1 = new BuchungInput(anzahl,buffer,konten); 035 /* 036 * Thread t2 gets forth size of iterations. 037 * Thread t3 and thread t4 gets each a half. 038 */ 039 Thread t2 = new BuchungDo(anzahl/2,buffer,"1"); 040 Thread t3 = new BuchungDo(anzahl/4,buffer,"2"); 041 Thread t4 = new BuchungDo(anzahl/4,buffer,"3"); 042 043 t1.start(); t2.start(); t3.start(); t4.start(); 044 t1.join(); t2.join(); t3.join(); t4.join(); 045 046 balance = 0.0; 047 for (int i = 0; i < konten.length; i++ ) { 048 stand = konten[i].zeigeGeld(); 049 balance += stand; 050 System.out.println("Konto " + i 051 + " Stand " + stand); 052 } 053 System.out.println("Balance " + balance); 054 055 } 056 057 } 058 059 /** 060 * Generates input data for Buchung. 061 * Uses an array KontoA[] "konten", int "anzahl" as 062 * number of accounts, "kmax" as konten.length and bmax as range 063 * of amount to transfer. 064 */ 065 class BuchungInput extends Thread { 066 private KontoA[] konten; 067 private int anzahl, kmax; 068 private double bmax; 069 private BoundedBuffer buffer; 070 071 /** 072 * Generates accouting data. 073 * @param a size of the buffer. 074 * @param b BoundedBuffer. 075 * @param k KontoA. 076 */ 077 BuchungInput(int a, BoundedBuffer b, KontoA[] k) { 078 anzahl = a; 079 buffer = b; 080 konten = k; 081 kmax = konten.length; 082 bmax = 100000.0; 083 } 084 085 /** 086 * Run in parallel. 087 */ 088 public void run() { 089 for (int i = 0; i < anzahl; i++) { 090 int a = (int) ( Math.random() * kmax ); 091 int b = (int) ( Math.random() * kmax ); 092 double betrag = (double) ( Math.random() * bmax ); 093 Ueberweisung u = new Ueberweisung( konten[a], konten[b], betrag ); 094 System.out.print("+"); 095 //try { 096 buffer.put( (Object)u ); 097 //} catch (InterruptedException e) { } 098 } 099 System.out.println(); 100 } 101 102 } 103 104 /** 105 * Process the Buchung data. 106 * Uses a buffer ("BoundedBuffer"), Int anzahl and String me. 107 */ 108 class BuchungDo extends Thread { 109 private int anzahl; 110 private BoundedBuffer buffer; 111 private String me = "-"; 112 113 /** 114 * This constructor generates int "anzahl" (number of accounts), 115 * a BoundedBuffer and String "m". 116 * @param a number of transactions. 117 * @param b BoundedBuffer. 118 * @param m String. 119 */ 120 BuchungDo(int a, BoundedBuffer b, String m) { 121 me = m; 122 anzahl = a; 123 buffer = b; 124 } 125 126 public void run() { 127 for (int i = 0; i < anzahl; i++) { 128 //try { 129 Ueberweisung u = (Ueberweisung) buffer.get(); 130 System.out.print(me); 131 u.run(); 132 //} catch (InterruptedException e) { } 133 } 134 System.out.println(); 135 } 136 137 }