Einführung in die objektorientierte Programmierung

Parellelität

Thread

class Thr1 extends Thread{
   
 String name;
 
 public Thr1(String name){
 this.name=name;
 }
 
 public void run(){
 for (int i=1; i<=100;i++ ) {
 System.out.println(name);
 try{
 sleep(Math.round( (Math.random()*1000)));
 }
 catch (InterruptedException e){
 
 }
 } // end of for
 }
 
 public static void main(String[] args){
 Thr1 t1= new Thr1("Thread1");
 Thr1 t2= new Thr1("Thread2");
 t1.start();
 t2.start();
 for (int i=1;i<=100 ;i++ ) {
 System.out.println("Main");
 } // end of for
 }
 
 }

Runnable

 class Thr2 implements Runnable{

public void run(){
for (int i=1;i<=100 ;i++ ) {
System.out.println("Thread");
} // end of for
}

public static void main(String args[]){
Thr2 o= new Thr2();
Thread t= new Thread(o);
t.start();
System.out.println("Main");

}

}

interrupt mit Exception (Schlafende Threads)

class Thr1 extends Thread{

String name;

public Thr1(String name){
this.name=name;
}

public void run(){
try{
for (int i=1; i<=100;i++ ) {
System.out.println(name);

sleep(Math.round( (Math.random()*1000)));

if (interrupted()) {
return;
} // end of if
} // end of for
}
catch (InterruptedException e){

}
}

public static void main(String[] args){
Thr1 t1= new Thr1("Thread1");
Thr1 t2= new Thr1("Thread2");
t1.start();
t2.start();
for (int i=1;i<=100 ;i++ ) {
System.out.println("Main");
} // end of for

System.console().readLine();

t2.interrupt();

System.console().readLine();

t1.interrupt();

}

}

interrupt mit Exception (Schlafende und nichtschlafende Threads)

class Thr2 extends Thread{

String name;

public Thr2(String name){
this.name=name;
}

public void run(){
boolean unterbrochen=false;
try{
do {
System.out.println(name);

sleep(Math.round( (Math.random()*1000)));

if (interrupted()) {
unterbrochen=true;
} // end of if
} while(unterbrochen==false);
}
catch (InterruptedException e){

}
}

public static void main(String[] args){
Thr1 t1= new Thr1("Thread1");
Thr1 t2= new Thr1("Thread2");
t1.start();
t2.start();
for (int i=1;i<=100 ;i++ ) {
System.out.println("Main");
} // end of for

System.console().readLine();

t2.interrupt();

System.console().readLine();

t1.interrupt();

}

}


Aufgabe 1

public class Warum {
public static void main(String[] argv) {
Test t = new Test();
t.start();
t.dotry();
t.interrupt();
}
}
class Test extends Thread {
public void run() {
boolean unterbrochen=false;
while (! unterbrochen) {
System.out.println("Hallo, ich komme.");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
unterbrochen = true;
}
if (interrupted()) {
unterbrochen=true;
} // end of if
}
}
// Zum Beenden Enter-Taste druecken
void dotry() {
try {
while (System.in.read() == 0) {
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Ich gehe. Auf Wiedersehen!");
}
}


Aufgabe 2

import java.awt.*;
import java.awt.event.*;
class Fenster extends Frame implements ActionListener {
boolean state = false;
Fenster() {
setSize(300, 100);
setLocation(100, 100);
Button b = new Button("Kick me!");
b.addActionListener(this);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
add(b, BorderLayout.CENTER);
actionPerformed(null);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (!state)
setTitle("Da staunt ihr ...");
else
setTitle("... nicht schlecht.");
state = !state;
}
public static void main(String[] args) {
new Fenster();
System.out.println("Also ich bin hier jetzt fertig.");
}
}


Aufgabe 3 (mit Verhungern)

 
 class Test{
 public static void main(String[] args){
 
 Tisch t=new Tisch();
 Philosoph p1=new Philosoph(1,t);
 Philosoph p2=new Philosoph(2,t);
 Philosoph p3=new Philosoph(3,t);
 Philosoph p4=new Philosoph(4,t);
 Philosoph p5=new Philosoph(5,t);
 
 p1.start();
 p2.start();
 p3.start();
 p4.start();
 p5.start();
 
 }
 }


class Tisch{
String[] staebchen = new String[5];

Tisch(){

for (int i=0;i<5 ; i++) {
staebchen[i]="frei";
} // end of for
}

public synchronized void nehmen(int st){
if (staebchen[st].equals("frei")) {
staebchen[st]="benutzt";
} // end of if
else {
try{
wait();
}
catch(InterruptedException e){

}
} // end of if-else
}

public synchronized void ablegen(int st){
staebchen[st]="frei";
notifyAll();
}


} class Philosoph extends Thread{
int name;
String zustand="philosophierend";
Tisch t;
int links,rechts;

Philosoph(int name, Tisch t){
this.name=name;
this.t=t;
links=name-1;
rechts=name;
if (rechts==5) {
rechts=0;
} // end of if
}

public void run(){
while (true) {
try{
//Zustand philosophierend
zustand="philosophierend";
System.out.println(this.name+" "+zustand);
sleep(Math.round(Math.random()*10000.0));
//Zustand hungrig
zustand="hungrig";
System.out.println(this.name+" "+zustand);
sleep(Math.round(Math.random()*10000.0));
//Stäbchen nehmen links
t.nehmen(links);
System.out.println(this.name+" links auf "+links);
sleep(Math.round(Math.random()*10000.0));
//Stäbchen nehmen rechts
t.nehmen(rechts);
System.out.println(this.name+" rechts auf "+rechts);
sleep(Math.round(Math.random()*10000.0));
//Zustand essend
zustand="essend";
System.out.println(this.name+" "+zustand);
sleep(Math.round(Math.random()*10000.0));
//Stäbchen ablegen links
t.ablegen(links);
System.out.println(this.name+" links ab "+links);
sleep(Math.round(Math.random()*10000.0));
//Stäbchen ablegen rechts
t.ablegen(rechts);
System.out.println(this.name+" rechts ab "+rechts);
sleep(Math.round(Math.random()*10000.0));


}
catch(Exception e){

}
} // end of while
}

}

Aufgabe 3 (mit Aufsicht)

class Test{
public static void main(String[] args){

Tisch t=new Tisch();
Philosoph p1=new Philosoph(1,t);
Philosoph p2=new Philosoph(2,t);
Philosoph p3=new Philosoph(3,t);
Philosoph p4=new Philosoph(4,t);
Philosoph p5=new Philosoph(5,t);

p1.start();
p2.start();
p3.start();
p4.start();
p5.start();


}
} class Tisch extends Thread{
String[] staebchen = new String[5];
int anzahl=0;

Tisch(){

for (int i=0;i<5 ; i++) {
staebchen[i]="frei";
} // end of for
}


} class Philosoph extends Thread{
int name;
String zustand="philosophierend";
Tisch t;
int links,rechts;

Philosoph(int name, Tisch t){
this.name=name;
this.t=t;
links=name-1;
rechts=name;
if (rechts==5) {
rechts=0;
} // end of if
}

public void run(){
while (true) {
try{
//Zustand philosophierend
zustand="philosophierend";
System.out.println(this.name+" "+zustand);
sleep(Math.round(Math.random()*10000.0));

//Zustand hungrig
zustand="hungrig";
System.out.println(this.name+" "+zustand);
sleep(Math.round(Math.random()*10000.0));

//an den Tisch setzen
setzen(name);
System.out.println(this.name+" setzen");
sleep(Math.round(Math.random()*10000.0));

//Stäbchen nehmen links
nehmen(links);
System.out.println(this.name+" links auf "+links);
sleep(Math.round(Math.random()*10000.0));

//Stäbchen nehmen rechts
nehmen(rechts);
System.out.println(this.name+" rechts auf "+rechts);
sleep(Math.round(Math.random()*10000.0));

//Zustand essend
zustand="essend";
System.out.println(this.name+" "+zustand);
sleep(Math.round(Math.random()*10000.0));

//Stäbchen ablegen links
ablegen(links);
System.out.println(this.name+" links ab "+links);
sleep(Math.round(Math.random()*10000.0));

//Stäbchen ablegen rechts
ablegen(rechts);
System.out.println(this.name+" rechts ab "+rechts);
sleep(Math.round(Math.random()*10000.0));

//vom Tisch aufstehen
aufstehen(name);
System.out.println(this.name+" aufstehen");
sleep(Math.round(Math.random()*10000.0));


}
catch(Exception e){
}
} // end of while
}

public synchronized void setzen(int phil){
while (t.anzahl==4) {
try{
wait();
}
catch(InterruptedException e){

}
}
t.anzahl++; notifyAll();
}

public synchronized void aufstehen(int phil){
t.anzahl--;
notifyAll();
}

public synchronized void nehmen(int st){
while (t.staebchen[st].equals("benutzt")) {
try{
wait();
}
catch(InterruptedException e){

}
}
t.staebchen[st]="benutzt";
notifyAll();
}

public synchronized void ablegen(int st){
t.staebchen[st]="frei";
notifyAll();
}
}


Aufgabe 4a Bank


public class GemeinsameVariablen {
public static void main(String[] args) {
Konto k1 = new Konto();
Konto k2 = new Konto();
Thread threadPit = new EinThread("Pit", k1);
Thread threadTom = new EinThread("Tom", k2);
Thread threadEva = new NochEinThread("Eva", k1);
threadPit.start();
threadTom.start();
threadEva.start();
}
} class Konto {
int kontoStand = 0;
public void einzahlen(int betrag) {
int hilfsvariable = kontoStand;
hilfsvariable = hilfsvariable + betrag;
kontoStand = hilfsvariable;
}
}

class EinThread extends Thread {
static int nummer = 0;
String name;
Konto meinKonto;
public EinThread(String s, Konto k) {
nummer++;
name = s;
meinKonto = k;
}
public void run() {
boolean bv = true;
while (bv) {
meinKonto.einzahlen(20);
yield();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
class NochEinThread extends EinThread {
   public NochEinThread(String s, Konto k) {
   super(s, k);
   }
   public void run() {
   while (true) {
   /*** 1 ***/
   System.out.println(""+nummer);
   System.out.println(name);
   System.out.println(meinKonto.kontoStand);
   yield();
   try {
   Thread.sleep(6000);
   } catch (InterruptedException e) {
   }
   }
   }
   }
 

Aufgabe 4b Bank

class Konto {
int kontoStand = 0;
public synchronized void einzahlen(int betrag) {
int hilfsvariable = kontoStand;
hilfsvariable = hilfsvariable + betrag;
kontoStand = hilfsvariable;
}
}
 

Aufgabe 4c Bank

public class GemeinsameVariablen {
public static void main(String[] args) {
Konto k1 = new Konto();
Konto k2 = new Konto();
Thread threadPit = new EinThread("Pit", k1);
Thread threadTom = new EinThread("Tom", k2);
Thread threadEva = new NochEinThread("Eva", k1);
threadPit.start();
threadTom.start();
threadEva.start();
}
} class Konto {
int kontoStand = 0;
public void einzahlen(int betrag) {
int hilfsvariable = kontoStand;
synchronized(this){
hilfsvariable = hilfsvariable + betrag;
kontoStand = hilfsvariable;
}
}
}
class EinThread extends Thread {
static int nummer = 0;
String name;
Konto meinKonto;
public EinThread(String s, Konto k) {
nummer++;
name = s;
meinKonto = k;
}
public void run() {
boolean bv = true;
while (bv) {
meinKonto.einzahlen(20);
yield();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
class NochEinThread extends EinThread {
   public NochEinThread(String s, Konto k) {
   super(s, k);
   }
   public void run() {
   while (true) {
   /*** 1 ***/
   synchronized(meinKonto){
   System.out.println(""+nummer);
   System.out.println(name);
   System.out.println(meinKonto.kontoStand);
   }
   yield();
   try {
   Thread.sleep(6000);
   } catch (InterruptedException e) {
   }
   }
   }
   }