У меня есть функция, которая должна выполнить две операции, та, которая заканчивается быстро и тот, который занимает много времени для выполнения. Я хочу смочь делегировать длительную операцию к потоку, и я не забочусь, когда поток заканчивается, но потоки должен завершиться. Я реализовал это как показано ниже, но, мой 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
}
}
public void someFunction(final String data) {
shortOperation(data);
new Thread(new Runnable() {
public void run(){
longOperation(data);
}
}).start();
}
Если вызывается someFunction
, JVM выполнит longOperation
, если
longOperation ()
не генерирует исключение и longOperation ()
ЕСЛИ ваша вторая функция не выполняется, это не имеет ничего общего с возвращением вашей функции. Если что-то вызывает System.exit ()
или ваша функция генерирует исключение, поток останавливается. В противном случае он будет работать до завершения, даже если ваш основной поток остановится. Этого можно избежать, установив новый поток как демон, но здесь вы этого не делаете.
JVM не завершит работу до завершения потока. Этот опубликованный вами код даже не компилируется; возможно, проблема в вашем реальном коде.