Лучший способ определить и распоряжаться заблокированной нитью в Java

StackOverflow https://stackoverflow.com/questions/3064835

  •  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();
        }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top