Лучший способ определить и распоряжаться заблокированной нитью в Java
-
28-09-2019 - |
Вопрос
Я должен вызвать функцию 3-го вечеринка модуль на новой теме. Из того, что я видел, вызов либо быстро завершится, если все прошло хорошо, или он просто висит, что когда-либо блокируя нить. Какой хороший способ начать нить и сделать звонок и ждать несколько секунд, и если поток все еще жив, то при условии, что он заблокирован, убить (или остановить или оставить) нить без использования каких-либо устаревших методов.
У меня есть что-то вроде этого, но я не уверен, что это лучший способ сделать это, и я хочу избежать звонка. Спасибо.
private void foo() throws Exception
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
// stuff that could potentially lock up the thread.
}
};
Thread thread;
thread = new Thread(runnable);
thread.start();
thread.join(3500);
if (thread.isAlive())
{
thread.stop();
throw new Exception();
}
}
Решение
public void stop() {
if (thread != null) {
thread.interrupt();
}
}
Смотрите эту ссылку о том, как остановить нить, он хорошо охватывает предмет
Другие советы
Нет никакого способа сделать то, что вы хотите (безоговорочно). Например, если stuff that could potentially lock up the thread.
Похоже, что нет способа остановить его, когда-либо не хватает System.exit ():
public void badStuff() {
while (true) {
try {
wait();
}
catch (InterruptedException irex) {
}
}
}
Когда ваше приложение застряло, запустите jStack (или используйте отладчик). Попробуйте выяснить, что придерживается функции и исправить ее.
Я бы посмотрел в java.util.concurrent
Executor
рамки и специально Future<T>
интерфейс. С этим вы абстрагируются несколько от фары Java.lang.thread, и вы получаете хорошее отделение того, что задачи от того, как они работают (будь то на отдельной резьбе, будь то нить из пула или создается летать и т. Д.)
Будущий экземпляр, по крайней мере, дает вам isDone
а также isCancelled
методы.
То ExecutorService
(поддержание Executor
) дает вам некоторые средства отключения любых выдающихся задач. Или проверить ExecutorService.awaitTermination(long timeout, TimeUnit unit)
метод
private void foo() throws Exception
{
ExecutorService es = Executors.newFixedThreadPool(1);
Runnable runnable = new Runnable()
{
@Override
public void run()
{
// stuff that could potentially lock up the thread.
}
};
Future result = es.submit(runnable);
es.awaitTermination(30, TimeUnit.SECONDS);
if (!result.isDone()){
es.shutdownNow();
}
}