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.
Ich starte zwei Threads, aber Sie werden genau nacheinandern ausgeführt und nicht nebenläufig.
Der Ausgegebene Text (println) ist korrekt.
Kann mir bitte jemand sagen, warum?
Danke.
Code:
package firstThreads;
public class TestThreads {
/**
* @param args
*/
public static void main(String[] args)
{
int numberToUse = Integer.parseInt(args[0]);
Number number = new Number();
new ThreadFactory("ersteZahl", numberToUse, number).start();
new ThreadFactory("zweiteZahl", numberToUse, number).start();
//new Thread(new RunnableFactory("zweiteZahl", numberToUse, number)).start();
}
}
Code:
package firstThreads;
public class ThreadFactory extends Thread
{
private String name;
private int valueToAdd;
private Number number;
public ThreadFactory(String name, int valueToAdd, Number n)
{
this.name = name;
this.valueToAdd = valueToAdd;
this.number = n;
}
public void run()
{
for (int i=0; i<10; i++)
{
int temp = number.getNumber();
number.setNumber(temp + valueToAdd);
System.out.println("Addition erledigt, neuer Wert: " + number.getNumber());
}
System.out.println("Letzte Addition erledigt. Endwert:" + number.getNumber());
}
}
Code:
package firstThreads;
public class Number
{
private int number;
public Number()
{
number = 0;
}
public int getNumber()
{
return number;
}
public void setNumber(int number)
{
this.number = number;
}
}
Das passiert deswegen, da der als erstes gestartete Thread sehr schnell abgearbeitet wird und daher scheint es, dass die beiden Threads nacheinander abgearbeitet werden - sie werden aber in Wirklichkeit so schnell abgearbeitet, dass keine Nebenläufigkeit eintritt bzw. "benötigt" wird!
Wenn du allerdings ein Thread.sleep(500) in deine run() methode (genauer in der for schleife der run methode) einbaust, dann wirst du sehen, dass die Threads nebenläufig abgearbeitet werden...
Code:
public void run()
{
for (int i = 0; i < 10; i++)
{
int temp = number.getNumber();
number.setNumber(temp + valueToAdd);
System.out.println(this.name + ": Addition erledigt, neuer Wert: " + number.getNumber());
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(this.name + ": Letzte Addition erledigt. Endwert:" + number.getNumber());
}
Der Befehl Thread.sleep(500) lässt den aktuellen Thread 500ms warten, bis er wieder aufegrufen wird...
Die Schleife innerhalb deiner Threads werden so schnell abgearbeitet, daß der
2. Thread gar nicht erst zum Zug kommt. Ändere deine Abbruchbedingung mal
auf 1000000. Vielleicht wird dann der erste Thread auch mal unterbrochen.