Java: Как остановить поток, который вызывает последовательность функций C ++, используя функцию JNI? - PullRequest
2 голосов
/ 09 марта 2012

Итак, вот моя ситуация:

У меня есть Java-приложение, которое отправляет массивы данных в C ++ DLL с использованием метода JNI из класса "JavaToCpp".

Как только DLL C ++ получила все данные, она начинает выполнять над ней несколько действий.

Я запускаю класс "JavaToCpp", используя новый поток, чтобы мой интерфейс Java не зависал во время (долго) (C ++) процедуры / подпрограммы.

Я реализовал два метода для остановки рабочих (C ++) процедур / подпрограмм:

  • Первая «STOP»: создается файл, которыйбудет прочитан DLL C ++, чтобы он мог полностью остановить запущенные процедуры / подпрограммы.
  • Второй "KILL": предполагается отключить / уничтожить работающие процедуры / подпрограммы C ++ напрямую

Проблема в том, что, посмотрев некоторое время, я не нашел ни одной хорошей уловки для ее выполнения.

Так что, если у кого-то есть идея, как убить поток, в то время как процедуры / подпрограммыбыть руннымнг ...

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

Единственный способ «убить» поток в Java - это устаревший stop () метод.

Прежде чем вы планируете использовать его, прочитайте и поймите , почему он устарел . Если вы понимаете это, вы не будете его использовать.

Так что нет, нет хорошего способа убить нить. Но почему вы говорите о процессах C ++ (или вы имели в виду процедуры, то есть подпрограммы)? Потому что если вы используете отдельный процесс (не поток) для выполнения нативной части, вы можете легко остановить его: используйте ProcessBuilder и Process.destroy () . Есть и другие преимущества в использовании процессов вместо потоков для вызова нативных вещей. Одним из преимуществ является то, что нестабильный собственный процесс не убьет ваш процесс Java.

2 голосов
/ 09 марта 2012

Лучший практический способ - иметь переменную, которая проверяется долгосрочной задачей, чтобы определить, когда остановиться.Вы можете использовать флаг Thread.currentThread().isInterrupted().

Проблема в том, что большинство потоков вы хотите уничтожить, потому что они плохо себя ведут.В этой ситуации единственный вариант - завершить процесс, что обычно означает запуск его сначала в другом процессе.

...