У меня есть книга по Java, по которой я изучаю, и в одном из примеров я увидел что-то подозрительное.
public class ThreadExample extends MIDlet {
boolean threadsRunning = true; // Flag stopping the threads
ThreadTest thr1;
ThreadTest thr2;
private class ThreadTest extends Thread {
int loops;
public ThreadTest(int waitingTime) {
loops = waitTime;
}
public void run() {
for (int i = 1; i <= loops; i++) {
if (threadsRunning != true) { // here threadsRunning is tested
return;
}
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.out.println(e);
}
}
}
}
public ThreadExample() {
thr1 = new ThreadTest(2);
thr2 = new ThreadTest(6);
}
public void startApp() throws MIDletStateChangeException {
thr1.start();
thr2.start();
try {
Thread.sleep(4000); // we wait 4 secs before stopping the threads -
// this way one of the threads is supposed to finish by itself
} catch(InterruptedException e) {
System.out.println(e);
}
destroyApp();
}
public void destroyApp() {
threadsRunning = false;
try {
thr1.join();
thr2.join();
} catch(InterruptedException e) {
System.out.println(e);
}
notifyDestroyed();
}
}
Поскольку это приложение MIDlet, при его запуске выполняется метод startApp. Для простоты сам метод startApp вызывает destroyApp, поэтому программа уничтожается, останавливая потоки и уведомляя об уничтожении.
Вопрос в том, безопасно ли использовать эту переменную threadsRunning и не вызовет ли ее использование внутри обоих потоков и в методе destroyApp какие-либо проблемы в какой-то момент? Поможет ли ключевое слово volatile перед объявлением синхронизировать его?