Я начал читать о том, как безопасно останавливать, прерывать, приостанавливать и возобновлять поток Java, я нашел в документации оракула следующие решения:
1- Как безопасно остановить цепочку:
private volatile Thread blinker;
public void stop() {
blinker = null;
}
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
Thread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
- Чтобы остановить поток, я могу использовать переменную boolean
вместо volatile Thread
, но почему Oracle настаивает на влиянии null на запущенный поток? есть ли какой-нибудь секрет (например, освобождение ресурсов, выделенных с помощью финализатора), который делает это таким образом?
2- Как прервать поток, который ждет долгое время:
public void stop() {
Thread moribund = waiter;
waiter = null;
moribund.interrupt();
}
- почему я должен создавать новую переменную moribund
, а не использовать напрямую waiter.interrupt()
?
3- Как приостановить и возобновить обсуждение:
private volatile boolean threadSuspended;
public void run() {
while (true) {
try {
Thread.sleep(interval);
if (threadSuspended) {
synchronized(this) {
while (threadSuspended)
wait();
}
}
} catch (InterruptedException e){
}
repaint();
}
}
public synchronized void mousePressed(MouseEvent e) {
e.consume();
threadSuspended = !threadSuspended;
if (!threadSuspended)
notify();
}
- Почему внутри метода run
они добавили цикл while (threadSuspended)
, потому что я не понимаю, какова цель его добавления, и мой код можно скомпилировать и правильно запустить без него (с такими же результатами).
Ссылка на источник http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html