2011-10-10 9 views
12

Jak przypisać Status z CallMe() przy użyciu isFinish(), aby mieć zwróconą wartość true?Jak uzyskać wartość zwróconą z wewnętrznej metody Thread Runnable w Javie?

public static boolean isFinish() 
{  
    boolean Status = false; 
    new Thread(new Runnable() 
    { 
    public void run() 
    { 
     /* This shell return true or false 
     * How do you keep it in Status 
     */ 
     CallMe(); 
    } 
    }).start(); 

    /* How can i get the true or false exactly from CallMe? here */ 
    return Status; 
} 

public static boolean CallMe() 
{ 
    /* some heavy loads ... */ 
    return true; 
} 
+3

Dlaczego w ogóle używać nici? Funkcja start() utworzy osobny wątek wykonania iw tym momencieFinish będzie kontynuował jego wykonywanie. –

Odpowiedz

27

Są na to dwa sposoby. Pierwszym z nich jest użycie przyszłego wyniku obliczeń, a drugim jest udostępnienie zmiennej. Myślę, że pierwsza metoda jest znacznie czystsza niż druga, ale czasami trzeba również przekazać wartości do wątku.

  • Korzystanie z RunnableFuture.

FutureTask implementuje RunnableFuture. Tworzysz więc to zadanie, które po uruchomieniu będzie miało wartość.

RunnableFuture f = new FutureTask(new Callable<Boolean>() { 
    // implement call 
}); 
// start the thread to execute it (you may also use an Executor) 
new Thread(f).start(); 
// get the result 
f.get(); 
  • Korzystanie z klasy uchwyt

utworzyć klasę trzyma wartość i podzielić się odniesienie do tej klasy. Możesz stworzyć własną klasę lub po prostu użyć AtomicReference. Według klasy posiadacza, mam na myśli klasę, która ma publiczny modyfikowalny atrybut.

// create the shared variable 
final AtomicBoolean b = new AtomicBoolean(); 
// create your thread 
Thread t = new Thread(new Runnable() { 
    public void run() { 
    // you can use b in here 
    } 
}); 
t.start(); 
// wait for the thread 
t.join(); 
b.get(); 
+0

+1, dobra odpowiedź –

+0

+1, jak dwie metody, naprawdę dziękuję. Potrzebowałem pełnego dupleksu, który daje mi najlepszy kierunek. – YumYumYum

+0

dziękuję! Potrzebowałem tego do mojego projektu uniwersyteckiego, bardzo pomogłeś. –

3

można przepisać kod do korzystania Callable<Boolean> i uzyskanie Future przy uruchamianiu Runnable.

Kontrakty terminowe pozwalają wątkowi uruchomieniowemu poprawnie sprawdzić, czy wartość jest gotowa i odczytać ją asynchronicznie. Możesz kodować ręcznie, ale ponieważ Future jest teraz częścią standardowych bibliotek JVM, dlaczego miałbyś (poza klasą programistyczną)?

1

Pracując z nieprzetworzonymi wątkami, można wprowadzić Runnable z nazwanym typem i zapisać w nim wartość.

class MyRunnable implements Runnable { 
    boolean status; 

    public void run() { 
     ... 
    } 
} 

Jednakże, jeśli pracujesz z innym wątkiem, będziesz musiał w jakiś sposób zsynchronizować.

Byłoby łatwiej użyć narzędzi wyższego poziomu dostarczonych przez hierarchię java.util.concurrent. Możesz złożyć zlecenie na rzecz Egzekutora i uzyskać Przyszłość. Możesz zapytać o przyszłość, jeśli to zrobione, i uzyskać wynik. Jest Oracle tutorial here.

Powiązane problemy