2010-04-20 10 views
14

Mam funkcję, która musi wykonać dwie operacje, jedną, która kończy się szybko, a druga zajmuje dużo czasu. Chcę móc przekazać długotrwałą operację do wątku i nie obchodzi mnie, kiedy wątek się zakończy, ale wątki muszą zostać ukończone. Zaimplementowałem to tak, jak pokazano poniżej, ale moja druga operacja nigdy nie zostanie wykonana, ponieważ funkcja kończy się po wywołaniu start(). Jak mogę zapewnić, że funkcja zwraca, ale drugi wątek operacji również kończy wykonywanie i nie jest zależny od wątku nadrzędnego?W jaki sposób można zaimplementować naprawdę asynchroniczny wątek Javy

public void someFunction(String data) 
{ 
    smallOperation() 
    SecondOperation a = new SecondOperation(); 
    Thread th = new Thread(a); 
    th.Start(); 
} 

class SecondOperation implements Runnable 
{ 
    public void run(){ 
    // doSomething long running 
} 
} 
+2

Nigdy nie używasz 'SecondOperation' w swoim' someFunction() ', jak możesz się spodziewać, że to uruchomi? –

+0

brakuje nawet średnika: -/ – fortran

+0

Przepraszamy, poprawiono błąd w moim kodzie. –

Odpowiedz

35
public void someFunction(final String data) { 
    shortOperation(data); 
    new Thread(new Runnable() { 
     public void run(){ 
      longOperation(data); 
     } 
    }).start(); 
} 

Jeśli someFunction nazywa, JVM będzie uruchamiać longOperation jeśli

  1. nić działa nie zaznaczono jako demon (w powyższym kodzie to nie jest)
  2. the longOperation() nie rzuca wyjątku i
  3. bez wywołania System.exit() w longOperation()
1

JVM nie wyjdzie przed zakończeniem wątku. Ten opublikowany kod nawet się nie kompiluje; być może problem leży w twoim prawdziwym kodzie.

+0

Napisałem tylko logiczną część kodu. –

+0

Nie mam pojęcia, co masz na myśli przez "część logiczną", ale podany kod nie jest tą częścią, która powoduje, że wątek się kończy. – danben

1

JEŚLI twoja druga funkcja nie działa, nie ma to nic wspólnego z powracaniem funkcji. Jeśli coś zadzwoni System.exit() lub jeśli twoja funkcja zgłasza wyjątek, wątek zostanie zatrzymany. W przeciwnym razie będzie działał, dopóki nie zostanie ukończony, nawet jeśli główny wątek zostanie zatrzymany. Można temu zapobiec, ustawiając nowy wątek na demona, ale nie robisz tego tutaj.

+0

Jak ustawić nowy wątek jako demona? –

+0

Po prostu, aby było jasne, ustawienie go na demona spowoduje, że JVM zakończy pracę przed zakończeniem, jeśli nie są uruchomione żadne inne wątki inne niż demony. Jest więc przeciwieństwem tego, czego chcesz. Ustawiasz go, wywołując setDaemon (true) na obiekcie Thread * przed * wywołaniem start(). – Yishai

0

Tworzysz prawdziwy asynchroniczny wątek, tworząc drugi wątek w tymczasowym wątku.

(new Thread(new Runnable() { public void run() { 
    (new Thread(new Runnable() { public void run() 
    { 
     /* async thread */ 
    }})).start(); 
}})).start(); 
Powiązane problemy