Wywoływanie czasochłonnego zadania JNI jako wątku

Mam trudny problem z wywołaniem funkcji natywnej przy użyciu JNI z wątku.

Funkcja natywna to starszy kod, który wykonuje zadanie wymagające dużej mocy obliczeniowej. Ponieważ nie chciałbym zamrozić reszty programu, obliczenia powinny być wykonywane w wątku w tle.EventBus służy do wysłania wyniku obliczeń z powrotem do programu głównego.

Zasadniczo topowinien być dość prostym, coś w tym stylu:

public class CalculationEngine {
  private CalculationEngine(){}

  public static void calculateInBackground(final Parameters parameters) {

    new Thread(new Runnable() {
      public void run() {
        // Someone might change the parameters while our thread is running, so:
        final Parameters clonedParameters = parameters.clone();
        Results results = new Results();
        natCalc(clonedParameters, results);
        EventBus.publish("Results", results);
      }
    }).start();

  }

  public static void calculateNormally(final Parameters parameters) {
    Results results = new Results();
    natCalc(parameters, results);
    EventBus.publish("Results", results);
  }

  private static native synchronized void
    natCalc(Parameters parameters, Results results);      
}

TerazcalculateNormally metoda, która blokuje program główny, działa dobrze, alecalculateInBackground metoda, która po prostu tworzy wątek tła, aby zrobić to samo, powoduje różne awarie kodu macierzystegokiedy jest wywoływany kolejno. Kolejno mam na myśli, że jest wywoływany ponownie dopiero po zakończeniu poprzedniego wątku i zwróceniu wyniku. Pamiętaj, że kod natywny jest zaznaczonysynchronized aby upewnić się, że tylko jedno wystąpienie może być uruchomione na raz.

Moje pytanie brzmi: w jaki sposób kod natywny może zachowywać się inaczej w zależności od tego, czy jest wywoływany z głównego wątku, czy z innego wątku? To tak, jakby kod natywny zachowywał „stan” i nie przestał działać, gdy jest wywoływany z wątku innego niż główny wątek. Czy istnieje sposób na „wyczyszczenie” lub „opróżnienie” wątku po jego zakończeniu? W JNI i wątkach musi być coś, czego po prostu nie znam.

Dziękujemy za wszelkie wskazówki!

questionAnswers(4)

yourAnswerToTheQuestion