Java Slayer: Thread Slayer I
Paweł Szulc kiedyś prowadził cykl Java Killers. Później zmienił się adres bloga i jego język, a idea killersów przeszła na plan dalszy. Dlatego też postanowiłem w ramach przygotowań do SCJP Wrzucać na bloga ciekawe (czyt. patologiczne) przypadki kodu. tytul cyklu zawdzięczamy Williamowi Kingowi i jego opowiadaniom o Gotreku i Felixie.
Zaczynamy od pewnego ciekawego zadania związanego z wątkami i synchronizacją.
Mamy dwa programy.
Listing 1. Program 1
package pl.koziolekweb.slayer;
public class ThreadSlayerIa {
public static void main(String[] args) {
MyThread t1 = new MyThread("1", new Integer(1));
MyThread t2 = new MyThread("2", new Integer(1));
t1.start();
t2.start();
}
}
class MyThread extends Thread {
private Integer i;
public MyThread(String name, Integer i) {
super(name);
this.i = i;
}
@Override
public void run() {
synchronized (i) {
while (true) {
System.out.println(i + " " + getName());
}
}
}
}
Listing 1. Program 2
package pl.koziolekweb.slayer;
public class ThreadSlayerIb {
public static void main(String[] args) {
MyThread t1 = new MyThread("1", new Integer(1000));
MyThread t2 = new MyThread("2", new Integer(1000));
t1.start();
t2.start();
}
}
class MyThread extends Thread {
private Integer i;
public MyThread(String name, Integer i) {
super(name);
this.i = i;
}
@Override
public void run() {
synchronized (i) {
while (true) {
System.out.println(i + " " + getName());
}
}
}
}
Pytania:
- Dlaczego programy wykonują się inaczej?
- Skąd ta różnica?
- Co należy zrobić by ujednolicić wykonanie programów?
Odpowiedzi proszę umieszczać w komentarzach. Rozwiązanie za kilka dni.
//Edit: Poprawiłem nazwę klasy w drugim programie.
Kod jest dostępny na licencji MIT. Jednak niektóre rozwiązania mogą być objęte inną licencją. W takim przypadku jest, to zaznaczone. Artykuły są dostępne na licencji CC-BY.
Jeżeli spodobał ci się ten wpis, to podziel się nim z innymi lub wesprzyj autora.