Einführung in die objektorientierte Programmierung

Zentraler Speicher für Threads

//In Thr1 ist kein gemeinsamer Speicher für beide Threads
class Thr1 extends Thread{
   
   String name;
   int zaehler=0;
   
   public Thr1(String name){
   this.name=name;
   }
   
   public void run(){
   for (int i=1; i<=100;i++ ) {
   zaehler++;
   System.out.println(name+" "+zaehler);
   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++ ) {
   try{
   sleep(Math.round( (Math.random()*1000)));
   System.out.println("Main");
   }
   catch (InterruptedException e){
   }
   } // end of for
   }
   
   }
 

 

//In Thr2 wird zaehler als gemeinsamer Speicher für beide Threads benutzt
class Thr2 implements Runnable{
   
   String name;
   int zaehler=0;
   
   public Thr2(String name){
   this.name=name;
   }
 public void run(){
   for (int i=1; i<=100;i++ ) {
   zaehler++;
   System.out.println(name+" "+zaehler);
   try{
   Thread.sleep(Math.round( (Math.random()*1000)));
   }
   catch (InterruptedException e){
 }
   } // end of for
   }
   
   public static void main(String[] args){
   Runnable o1= new Thr2("Thread1");
   //Runnable o2= new Thr2("Thread2");
   Thread t1= new Thread(o1);
   Thread t2= new Thread(o1);
   t1.start();
   t2.start();
   for (int i=1;i<=100 ;i++ ) {
   try{
   Thread.sleep(Math.round( (Math.random()*1000)));
   System.out.println("Main");
   }
   catch (InterruptedException e){
   }
   } // end of for
   }
   
   }

Aufg 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 weiter = true;
while (weiter) {
System.out.println("Hallo, ich komme.");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
weiter =false;
}
if (interrupted()) {
weiter =false;
} // 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!");
}
}

Aufg 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.");
}
}

 

Aufg 3 a

class Main{
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 {
public boolean[] staebchen_benutzt = new boolean[5];

public boolean links_belegt(int philnr){
return staebchen_benutzt[philnr-1];
}

public void links_aufnehmen(int philnr){
staebchen_benutzt[philnr-1]=true;
}

public boolean rechts_belegt(int philnr){
int nr;
nr=philnr;
if (philnr==5) {
nr=0;
} // end of if
return staebchen_benutzt[nr];
}

public void rechts_aufnehmen(int philnr){
int nr;
nr=philnr;
if (philnr==5) {
nr=0;
} // end of if
staebchen_benutzt[nr]=true;
}

public void links_ablegen(int philnr){
staebchen_benutzt[philnr-1]=false;
}

public void rechts_ablegen(int philnr){
int nr;
nr=philnr;
if (philnr==5) {
nr=0;
} // end of if
staebchen_benutzt[nr]=false;
}

} class Philosoph extends Thread{

int name=0;
Tisch t;

Philosoph(int name, Tisch t){
this.name=name; this.t=t;
}

public void run(){
while (true) {
philosophieren();
hungern();
st_links();
st_rechts();
essen();
st_links_weg();
st_rechts_weg();

} // end of while

}


void philosophieren(){
System.out.println("Philosoph "+name+ " philosopiert");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

void hungern(){
System.out.println("Philosoph "+name+ " hungert");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

void essen(){
System.out.println("Philosoph "+name+ " isst");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

synchronized void st_links(){
System.out.println("Philosoph "+name+ " will linkes Stäbchen");
boolean belegt=t.links_belegt(this.name);
if (belegt) {
try{
wait();
}
catch(InterruptedException ie){

}
} // end of if
t.links_aufnehmen(this.name);
System.out.println("Philosoph "+name+ " nimmt linkes Stäbchen");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

synchronized void st_rechts(){
System.out.println("Philosoph "+name+ " will rechtes Stäbchen");
boolean belegt=t.rechts_belegt(this.name);
if (belegt) {
try{
wait();
}
catch(InterruptedException ie){

}
} // end of if
t.rechts_aufnehmen(this.name);
System.out.println("Philosoph "+name+ " nimmt rechtes Stäbchen");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

synchronized void st_links_weg(){
t.links_ablegen(this.name);
notifyAll();
}

synchronized void st_rechts_weg(){
t.rechts_ablegen(this.name);
notifyAll();
}

}

Aufg 3 c

class Main{
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 {
int am_tisch=0;

public boolean[] staebchen_benutzt = new boolean[5];

public boolean links_belegt(int philnr){
return staebchen_benutzt[philnr-1];
}

public void links_aufnehmen(int philnr){
staebchen_benutzt[philnr-1]=true;
}

public boolean rechts_belegt(int philnr){
int nr;
nr=philnr;
if (philnr==5) {
nr=0;
} // end of if
return staebchen_benutzt[nr];
}

public void rechts_aufnehmen(int philnr){
int nr;
nr=philnr;
if (philnr==5) {
nr=0;
} // end of if
staebchen_benutzt[nr]=true;
}

public void links_ablegen(int philnr){
staebchen_benutzt[philnr-1]=false;
}

public void rechts_ablegen(int philnr){
int nr;
nr=philnr;
if (philnr==5) {
nr=0;
} // end of if
staebchen_benutzt[nr]=false;
}

boolean darf_sitzen(int philnr){
return (am_tisch <4 );
}

void setzt_sich(int philnr){
if (am_tisch<4 ) am_tisch++ ;
}

void steht_auf(int philnr){
am_tisch-- ;
}

} class Philosoph extends Thread{

int name=0;
Tisch t;

Philosoph(int name, Tisch t){
this.name=name; this.t=t;
}

public void run(){
while (true) {
philosophieren();
hungern();
setzen();
st_links();
st_rechts();
essen();
st_links_weg();
st_rechts_weg();
aufstehen();

} // end of while

}


void philosophieren(){
System.out.println("Philosoph "+name+ " philosopiert");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

void hungern(){
System.out.println("Philosoph "+name+ " hungert");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

void essen(){
System.out.println("Philosoph "+name+ " isst");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

synchronized void st_links(){
System.out.println("Philosoph "+name+ " will linkes Stäbchen");
boolean belegt=t.links_belegt(this.name);
if (belegt) {
try{
wait();
}
catch(InterruptedException ie){

}
} // end of if
t.links_aufnehmen(this.name);
System.out.println("Philosoph "+name+ " nimmt linkes Stäbchen");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

synchronized void st_rechts(){
System.out.println("Philosoph "+name+ " will rechtes Stäbchen");
boolean belegt=t.rechts_belegt(this.name);
if (belegt) {
try{
wait();
}
catch(InterruptedException ie){

}
} // end of if
t.rechts_aufnehmen(this.name);
System.out.println("Philosoph "+name+ " nimmt rechtes Stäbchen");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

synchronized void st_links_weg(){
t.links_ablegen(this.name);
notifyAll();
}

synchronized void st_rechts_weg(){
t.rechts_ablegen(this.name);
notifyAll();
}

synchronized void setzen(){
System.out.println("Philosoph "+name+ " will sich setzen");
boolean frei=t.darf_sitzen(this.name);
if (! frei) {
try{
wait();
}
catch(InterruptedException ie){

}
} // end of if
t.setzt_sich(this.name);
System.out.println("Philosoph "+name+ " setzt sich");
try{
sleep( (long) (Math.random()*1000));
}
catch(InterruptedException ie){

}
}

synchronized void aufstehen(){
System.out.println("Philosoph "+name+ " will aufstehen");
t.steht_auf(this.name) ;
notifyAll();
}
}