2012-07-15 24 views
5

Rozważmy następujący kod:Jak działa metoda join() klasy Thread?

class ThreadJoinTest{ 
    public static void main(String[] arguments){ 
     TimeUnit unit; 
     final Thread taskThread = new Thread(task); 
     taskThread.start(); 
     taskThread.join(unit.millis(timeout)); 
    } 
} 

Więc gdy główny wątek będzie wykonać linię taskThread.join() o wartości limitu czasu, główny wątek jest dając wystarczająco dużo czasu, aby zakończyć taskThread swoje zadanie? Czy jest to główny cel metody łączenia?

Co się stanie, jeżeli:

  1. taskThread zakończy realizację przed czasem przerwa?
  2. Co się stanie, jeśli limit czasu zostanie osiągnięty, ale taskThread nie zakończył jeszcze wykonywania? Czy taskThread ma szansę zakończyć swoje zadanie, czy nie?
  3. W jaki sposób główny wątek wie, że join został zwrócony, ponieważ taskThread zakończył się normalnie lub z powodu przekroczenia limitu czasu?

Odpowiedz

5
  1. main będzie mógł rozpocząć ponownie jak najszybciej taskThread jest zrobić.
  2. Następnie main będzie mógł rozpocząć się ponownie, a taskThread będzie kontynuowany. Oba wątki zostaną ukończone.
  3. Jeśli albo taskThread zakończy się normalnie, albo przekroczony zostanie limit czasu, główne działanie będzie kontynuowane. Nie ma sposobu, aby main wiedzieć, czy upłynął limit czasu lub czy taskThread zakończył wykonywanie bez użycia innych środków komunikacji.
+0

Myślę, że twoja odpowiedź odpowiada na dwa pierwsze pytania, ale nie na trzeci. Ponieważ powrót z łączenia jest typu void, jak główny wątek wie, czy wątek taskThread został ukończony normalnie, czy z powodu limitu czasu? – Geek

+0

@Geek: Dodano więcej informacji. – Keppil

+0

więc jest to usterka w projekcie .. co o tym myślisz? – Geek

4

join() gdy wezwał wątku, będzie czekać do tego wątku umrzeć (czyli do sposobu wykonywania tego wątku, aby zrobić z ..) Tylko wtedy linia poniżej join() wykona. Ale przyznanie limitu czasu w join(), sprawi, że efekt join() zostanie unieważniony po określonym czasie oczekiwania.

Mimo upływu limitu czasu zadanieThread będzie mogło zakończyć pracę.

+0

więc zakładając, że upłynął limit czasu i zadanieThread nie zostało jeszcze zakończone, czy taskThread zginie z powodu przekroczenia limitu czasu? – Geek

+0

Nie, nawet po przekroczeniu limitu czasu, taskhTread może zakończyć pracę –

+0

ok, dostałem to. A co z ostatnim pytaniem? Zobacz także mój komentarz dotyczący odpowiedzi Keppila. – Geek

1

Warunek limitu czasu będzie miał pierwszeństwo. Po przekroczeniu limitu czasu główny wątek i taskThread są równie prawdopodobnymi kandydatami do wykonania.