Java: Как остановить поток?

Есть ли способ остановить другой поток из OUTSIDE потока? Например, если я запустил поток для запуска этого потока и заставил этот поток остановиться? Остановит ли он другую нить?

Есть ли способ остановить поток изнутри без цикла? Например, если вы загружаете в идеале, вы бы хотели использовать цикл, и если я использую цикл, я не буду останавливать его до тех пор, пока он не достигнет конца цикла.

Ответ 1

Вы можете создать логическое поле и проверить его внутри run:

public class Task implements Runnable {

   private volatile boolean isRunning = true;

   public void run() {

     while (isRunning) {
         //do work
     }
   }

   public void kill() {
       isRunning = false;
   }

}

Чтобы остановить его, просто вызовите

task.kill();

Это должно работать.

Ответ 2

Мы не останавливаем или не убиваем нить, а делаем Thread.currentThread().isInterrupted().

public class Task1 implements Runnable {
    public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                       ................
                       ................
                       ................
                       ................
           }
    }
}

в основном мы сделаем вот так:

Thread t1 = new Thread(new Task1());
t1.start();
t1.interrupt();

Ответ 3

Один из возможных способов - сделать что-то вроде этого:

public class MyThread extends Thread {
    @Override
    public void run() {
        while (!this.isInterrupted()) {
            //
        }
    }
}

И когда вы хотите остановить свой поток, просто вызовите метод interrupt():

myThread.interrupt();

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

mySocket.setSoTimeout(50);

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

Невозможно убить поток любым другим способом, и вы должны реализовать такое поведение самостоятельно. В прошлом Thread имел некоторый метод (не уверен, что kill() или stop()) для этого, но он устарел сейчас. Мой опыт в том, что некоторые реализации JVM даже не содержат этот метод в настоящее время.

Ответ 4

Рекомендуемым способом будет создание этого в потоке. Таким образом, вы не можете (или, скорее, не должны) убить поток извне.

Регулярно проверяйте поток, если это необходимо для остановки. (Вместо того, чтобы блокировать сокет до тех пор, пока не будут данные. Используйте тайм-аут и каждый раз в то время проверяйте, хочет ли пользователь остановиться)

Ответ 5

Рекомендация JavaSun заключается в использовании общей переменной в качестве флага, который просит остановить фоновый поток. Затем эту переменную можно установить другим объектом, запрашивающим завершение потока.

Вы можете таким образом убить другой процесс, а затем текущий.