безопасный способ остановить поток в Java - PullRequest
1 голос
/ 28 декабря 2011
public class thread extends Thread {

    static volatile boolean done = false;// volatile keyword is used            

@Override
public void run() {
    while (!done) {
        for (int i = 1; i < 10; i++) {

            try {
                thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(currentThread());
            System.out.println("1st thread>> " + i);
        }
    }
}

public static void main(String[] args) throws InterruptedException {

    Thread th = new Thread(new thread(),"mythread");
    th.start();
    for (int i = 1; i < 10; i++) {
        thread.sleep(400);
        System.out.println(currentThread());
        System.out.println("2nd thread>> " + i);
        if (i == 4) {
            done = true;// safe way to stop a thread
            break;
        }
    }

   }
  }

Я использую переменную переменную static здесь. Это безопасный способ остановить поток, а также, когда я печатаю метод currentThread (), я получаю вывод, подобный Thread [mythread, 5, main], что делаетглавная ссылка ??

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

Это безопасный способ остановить поток, но нет никакой причины для статической переменной: вы хотите остановить один поток, а не все потоки одного и того же класса. Более того, существует более стандартный и менее хрупкий способ остановки потока: его прерывание.

public void run() {
    while (!Thread.currentThread().isInterrupted() {
        ...
    }
}

...

th.interrupt();

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

try {
    thread.sleep(200);
} 
catch (InterruptedException e) {
    return;
}
1 голос
/ 28 декабря 2011

Поток к toString, который вызывается при выполнении System.out.println (currentThread ()) выводит имя потока, приоритет и группу потоков.

Я предполагаю, что вы пытаетесь прервать поток для чего-то другого, кроме нормального завершения, так почему бы просто не использовать Thread.interrupt () и Thread.isInterrupted ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...