Вы не сможете волшебным образом остановить работающую нить через 30 секунд; то, что вам нужно сделать, это заставить этот поток проверять некоторое состояние после истечения времени, заметить, что оно заняло слишком много времени и return
из его метода run.
Есть примерно два подхода к этому:
- Сделайте так, чтобы поток вызова библиотеки выполнял свою работу в "чанках", каждый из которых занимает небольшое количество времени, и проверял состояние между каждым чанком. Например, если вы обрабатываете сотни тысяч записей, вы можете обработать несколько сотен в одном пакете, а затем установите флажок. Или, если вы делаете потенциально блокирующие вызовы с доступным временем ожидания, установите время ожидания на 500 мс и отметьте флаг между каждым вызовом.
- Пусть основной поток прервет поток вызовов библиотеки, когда время истечет, и убедитесь, что поток библиотеки правильно обрабатывает прерывания и проверяет флаг, когда это так. Для этого потребуется, чтобы поток вызова библиотеки выполнял прерываемый метод, хотя любой потенциально длительный метод должен допускать прерывания.
В обоих случаях вам понадобится, чтобы один из потоков (вероятно, основной поток, так как ему больше нечего делать) установит флаг "stop" на true
по истечении времени (и эта переменная быть объявленным изменчивым, поэтому обновления видны всем потокам). Аналогично, когда поток вызова библиотеки видит этот флаг как true, он должен прекратить то, что он делает, обычно возвращаясь из метода run ().
Вы не должны действительно убивать поток библиотеки из основного потока; см. Почему Thread.stop, Thread.suspend и Thread.resume устарели по причинам и альтернативе, которая очень похожа на то, что я описал выше. : -)