Это безопасный способ остановить поток, но нет никакой причины для статической переменной: вы хотите остановить один поток, а не все потоки одного и того же класса.
Более того, существует более стандартный и менее хрупкий способ остановки потока: его прерывание.
public void run() {
while (!Thread.currentThread().isInterrupted() {
...
}
}
...
th.interrupt();
Это дает дополнительное преимущество, заключающееся в том, что поток, который находится в спящем или ожидающем режиме или заблокирован прерывистым методом ввода-вывода, будет разбужен с помощью InterruptedException. Когда такое исключение происходит, это означает, что поток должен прекратить работу, поэтому вы не должны проглотить исключение, как вы это сделали. Вместо этого вы должны как можно быстрее вернуться из метода run:
try {
thread.sleep(200);
}
catch (InterruptedException e) {
return;
}