26 lutego 2009

SCJP - Test z wątków

Przyszło mi właśnie do głowy takie pytanko testowe pod kątem SCJP - jaki będzie efekt uruchomienia poniższego kodu (odpowiedź do "wytestowania"):
public class ThreadTest {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable(), "my thread");

thread.run();
}
}

class MyRunnable implements Runnable {
public void run() {
System.out.print(Thread.currentThread().getName());
}
}
  1. wyświetlenie napisu 'my thread'
  2. wyświetlenie napisu 'main'
  3. brak efektu - żaden napis nie zostanie wyświetlony
  4. program się nie skompiluje
  5. program się skompiluje ale uruchomienie zakończy się wyjątkiem

5 komentarzy:

Anonimowy pisze...

Wyświetli 'main', tylko dlaczego?

Anonimowy pisze...

Jak dlaczego. Przecież podaje nazwe watka w którym działa.
Jeżeli chcesz threada "my thread" to wypadałoby go uruchomić thread.start();

Mariusz Lipiński pisze...

Dokładnie tak. Metoda run() to zwykła metoda - nie powoduje ona utworzenia nowego wątku, ale oczywiście możemy ją sobie wywołać, więc nie ma błedu. Implementacja metody run() w klasie Thread jest taka, że jeśli instancję klasy Thread utworzono na bazie instancji Runnable to wywołuje ona metodę run() z tejże instancji Runnable. Implementacja metody run() w klasie implementującej Runnable w naszym przykładzie jest taka, że wyświetlana jest nazwa bieżącego wątku. Bieżącym jest wątek główny a ten domyślnie ma nazwę 'main'.

Tomasz Nurkiewicz pisze...

Jestem przekonany, że już gdzieś widziałem takie pytanie... A ponieważ nie robiłem dużo mocków, prawie na pewno było to na... egzaminie SCJP 6 :-). Gratuluję intuicji :-).

Anonimowy pisze...

Dzięki za wyjaśnienie, dopiero zaczynam z Javą.