Как вы убиваете нить в Java? - PullRequest
356 голосов
/ 22 марта 2009

Как убить java.lang.Thread в Java?

Ответы [ 15 ]

2 голосов
/ 24 июня 2018

Обычно вы не убиваете, не останавливаете и не прерываете поток (или не проверяете, прерван ли он ()), но позволяете ему завершаться естественным образом.

Это просто. Вы можете использовать любой цикл вместе с (volatile) логической переменной внутри метода run () для контроля активности потока. Вы также можете вернуться из активного потока в основной поток, чтобы остановить его.

Таким образом, вы изящно убиваете нить :).

1 голос
/ 19 марта 2019

'Killing a thread' - неправильная фраза для использования. Вот один способ, которым мы можем реализовать изящное завершение / завершение потока по желанию:

Runnable, который я использовал:

class TaskThread implements Runnable {

    boolean shouldStop;

    public TaskThread(boolean shouldStop) {
        this.shouldStop = shouldStop;
    }

    @Override
    public void run() {

        System.out.println("Thread has started");

        while (!shouldStop) {
            // do something
        }

        System.out.println("Thread has ended");

    }

    public void stop() {
        shouldStop = true;
    }

}

Класс срабатывания:

public class ThreadStop {

    public static void main(String[] args) {

        System.out.println("Start");

        // Start the thread
        TaskThread task = new TaskThread(false);
        Thread t = new Thread(task);
        t.start();

        // Stop the thread
        task.stop();

        System.out.println("End");

    }

}
1 голос
/ 04 августа 2016

Вот несколько хороших прочтений по теме:

Что вы делаете с InterruptedException?

Чистое отключение нитей

1 голос
/ 18 февраля 2015

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

Существует два основных правильных решения для контролируемых окончаний потоков:

  • Использование общего изменчивого флага
  • Использование пары методов Thread.interrupt () и Thread.interrupted ().

Хорошее и подробное объяснение проблем, связанных с прерыванием резких потоков, а также примеры неправильных и правильных решений для завершения контролируемых потоков можно найти здесь:

https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop%28%29+to+terminate+threads

0 голосов
/ 07 июля 2017

Я не получил прерывание для работы в Android, поэтому я использовал этот метод, отлично работает:

boolean shouldCheckUpdates = true;

private void startupCheckForUpdatesEveryFewSeconds() {
    Thread t = new Thread(new CheckUpdates());
    t.start();
}

private class CheckUpdates implements Runnable{
    public void run() {
        while (shouldCheckUpdates){
            //Thread sleep 3 seconds
            System.out.println("Do your thing here");
        }
    }
}

 public void stop(){
        shouldCheckUpdates = false;
 }
...