2012-03-09 1 views
2

Итак, вот моя ситуация:Java: Как остановить поток, который вызывает последовательность функций C++ с использованием функции JNI?

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

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

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

Я реализовал два способа, чтобы остановить работу (C++) процедуры/Подпрограммы:

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

Проблема заключается в том, что, посмотрев на некоторое время, я не нашел ничего хорошего трюк perfom его ,

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

ответ

2

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

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

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

+0

Да, извините, я имел в виду «процедуры/подпрограммы». Использование «Процессов» для вызова моей C++ DLL будет работать одинаково? (Я предполагаю, что он будет использовать больше памяти, и мои ресурсы не будут использоваться совместно с Dll (например, я должен вызывать Java-методы из моей C++ DLL для добавления результатов в Java GUI)) – Jsncrdnl

+0

@ Kuroicloud666: JNI только карты вызовы в рамках одного и того же процесса.Если вы используете отдельный процесс, вы должны использовать некоторые механизмы взаимодействия между процессами, такие как сокеты TCP/IP (может быть, проще) или каналы (возможно, быстрее) или даже временные файлы (в некоторых случаях это может быть вполне нормально). Поэтому переключаться между ними не так просто, это принципиальное дизайнерское решение. –

+0

okok, спасибо за ответ. – Jsncrdnl

2

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

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

+0

Дело в том, что я не рассчитываю, что моя библиотека C++ получит какое-либо новое значение из моего приложения Java. В этом случае вы говорите мне, у меня уже есть решение. Мне нужно знать, есть ли способ сбросить/убить/остановить поток (и, следовательно, процессы C++, которые запущены) ... – Jsncrdnl

+0

Вам нужно сигнализировать процесс, который будет убивать поток. Небезопасно убивать отдельный поток, поскольку потоки разделяют ресурсы, такие как память, блокировки, файлы и т. Д. –

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