Как каждый реализует действительно асинхронный поток Java

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

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
 }
} 
18
задан Ritesh M Nayak 21 April 2010 в 04:52
поделиться

3 ответа

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

Если вызывается someFunction , JVM выполнит longOperation , если

  1. запущенный поток не помечено как демон (в приведенном выше коде это нет)
  2. longOperation () не генерирует исключение и
  3. в longOperation ()
42
ответ дан 30 November 2019 в 06:59
поделиться

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

1
ответ дан 30 November 2019 в 06:59
поделиться

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

1
ответ дан 30 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: