Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Folgender PseudoCode soll in Java umgewandelt werden:
Hierzu habe ich folgende Lösung erarbeitet:
Java:
public class ConcurrentCalculation extends Thread {
int count = 1;
int temp;
public ConcurrentCalculation(int i) {
// TODO Auto-generated constructor stub
this.temp=i;
}
public void run(){
for(int i = 0; i<2; i++){
temp = count + 2;
count = temp;
System.out.println(this.getName() + " Count " + count);
}
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Thread P = new Thread(new ConcurrentCalculation(0));
Thread Q = new Thread(new ConcurrentCalculation(0));
P.start();
Q.start();
P.join();
Q.join();
System.out.println("P ist fertig.");
System.out.println("Q ist fertig.");
}
}
Laut Aufgabenstellung soll die Terminierung zu Unregelmäßigkeiten führen, aber egal wie oft ich den Code ausführe. Ich bekomme immer korrekte Ergebnisse. Weiß jemand warum?
Das liegt daran, dass jeder Thread auf seinem eigenem "count" rechnet.
Dh die Threads greifen nicht beide auf die gleiche Variable zu und deswegen kommt es auch zu keinen Unregelmäßigkeiten.
Mach den "count" mal static, dann kommen auch die genannten Unregelmäßigkeiten zustande.
[...]
Laut Aufgabenstellung soll die Terminierung zu Unregelmäßigkeiten führen, aber egal wie oft ich den Code ausführe. Ich bekomme immer korrekte Ergebnisse. Weiß jemand warum?
Du hast etwas in der Aufgabenstellung übersehen. Die Variable count soll von zwei Threads geschrieben und gelesen werden. Du definierst count aber in einer Klasse von denen du dann in main(), zwei eigenständige Instanzen erstellst die nichts miteinander zu tun haben.
Jede einzelne Instanz bringt als Ergebnis die Reihenfolge 3,5. Ich bin aber ziemlich sicher das es eine Gesamtreihenfolge von 3,5,7,9 sein sollte, da count zwischen zwei Threads geteilt werden soll. Die Beschreibung erfordert absichtlich keine Synchronisationsbedingung damit sichtbar wird zu welchen Problemen es kommen kann.
Führ den unten stehenden Code mehrfach aus und achte auf die Ausgabe.
Java:
public class ConcurrentCalculation{
private int count = 1;
private class Task implements Runnable{
private int temp = 0;
@Override
public void run(){
String threadName = Thread.currentThread().getName();
for(int i = 0; i<2; i++){
temp = count + 2;
count = temp;
System.out.println(threadName + " Count " + count);
}
System.out.println(threadName+" ist fertig.");
}
}
public static void main(String[] args) throws Exception {
ConcurrentCalculation concCalc = new ConcurrentCalculation();
Thread P = new Thread(concCalc.new Task());
P.setName("P");
Thread Q = new Thread(concCalc.new Task());
Q.setName("Q");
P.start();
Q.start();
}
}