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) {
}
}
}
}