2010-04-20 5 views
14

У меня есть функция, которая должна выполнять две операции: одну, которая заканчивается быстро и одна занимает много времени для запуска. Я хочу иметь возможность делегировать длительную операцию в поток, и я не забочусь о завершении потока, но потоки должны быть завершены. Я реализовал это, как показано ниже, но моя вторая операция никогда не выполняется, так как функция выходит после вызова start(). Как я могу гарантировать, что функция вернется, но второй рабочий поток также завершит ее выполнение и не зависит от родительского потока?Как реализовать реалистично асинхронный поток java

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

Вы никогда не используете 'SecondOperation' в свой' someFunction() ', как вы ожидаете его запуска? –

+0

вам даже не хватает точки с запятой: -/ – fortran

+0

Извините, исправлена ​​ошибка в моем коде. –

ответ

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

Если someFunction называется, виртуальная машина будет работать longOperation если

  1. нить работает она не помечена как демон (в приведенном выше коде не)
  2. longOperation() не генерирует исключение, и
  3. нет вызовов в System.exit() сделано в longOperation()
1

JVM не выйдет, прежде чем поток завершится. Этот код, который вы опубликовали, даже не компилируется; возможно, проблема в вашем фактическом коде.

+0

Я написал только логическую часть кода. –

+0

Я понятия не имею, что вы подразумеваете под «логической частью», но код, который вы предоставили, не является частью, из-за которой заканчивается ваш поток. – danben

1

Если ваша вторая функция не выполняется, это не имеет ничего общего с возвращаемой функцией. Если что-то вызывает System.exit() или если ваша функция генерирует исключение, то поток остановится. В противном случае он будет работать до тех пор, пока он не будет завершен, даже если ваш основной поток остановится. Этого можно предотвратить, установив новый поток в качестве демона, но вы этого не делаете.

+0

Как установить новый поток в качестве демона? –

+0

Просто, чтобы быть ясным, установка его на демона приведет к тому, что JVM завершит работу до того, как он будет завершен, если не будут выполняться никакие другие не-демона. Так что это противоположность тому, что вы хотите. Вы устанавливаете его, вызывая setDaemon (true) в объекте Thread * перед * вызовом start(). – Yishai

0

Вы создаете настоящий асинхронный поток, создавая второй поток во временном потоке.

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

 Смежные вопросы

  • Нет связанных вопросов^_^