Java FX – Поток приостанавливается некорректно
Формулировка задачи:
Всем привет. Пытаюсь написать симулятор чата, который генерирует сообщения в отдельном потоке. Этот поток мне нужно уметь создавать, приостанавливать и снова запускать его работу. Текущий код работает некорректно. Нажимаю на кнопку connect – запускается поток и сразу же встаёт в ожидание, как и требуется. Нажатие на unpause выводит его из режима ожидания, и поток симулирует генерацию сообщений. Если же нажимаю на pause, то гуи зависает, а сообщения продолжают генерироваться. В итоге поток всё-таки останавливается, но через неопределённое время. Может через секунду, а может через минуту и гуи соответственно тоже «отвисает». Чем больше читаю про wait и notify, тем больше не понимаю, почему не работает. Ведь у меня всего один второстепенный поток и его нужно всего лишь приостанавливать и снова запускать. Заранее благодарен за помощь.
Прикладываю код и весь проект (eclipse).
Starter
ClientController
ChatSimulator
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
public class Starter extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
try {
AnchorPane root = (AnchorPane) FXMLLoader.load(getClass()
.getResource("mainWindow.fxml"));
Scene scene = new Scene(root, 400, 300);
scene.getStylesheets().add(
getClass().getResource("application.css")
.toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
}package application;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
public class ClientController {
@FXML
private Button btnConnect;
@FXML
private Button btnUnpause;
@FXML
private Button btnPause;
@FXML
private Label lblState;
private ChatSimulator tm;
@FXML
private void connectChat() {
tm = new ChatSimulator();
tm.start();
lblState.setText("Connected");
}
@FXML
private void actUnpause() {
tm.unpause();
lblState.setText("Unpause");
}
@FXML
private void actPause() {
tm.pause();
lblState.setText("Pause");
}
}package application;
public class ChatSimulator extends Thread {
private boolean pause;
public ChatSimulator() {
pause = true;
}
@Override
public void run() {
while (true) {
sendMessage();
}
}
public synchronized void sendMessage() {
try {
if (pause) {
System.out.println("Method sendMessage waits " + Thread.currentThread());
wait();
} else {
System.out.println("Method sendMessage runs " + Thread.currentThread());
sleep(1000);
}
} catch (InterruptedException exc) {
exc.printStackTrace();
}
}
public synchronized void pause() {
System.out.println("Method Pause " + Thread.currentThread());
pause = true;
System.out.println("///////////// ");
}
public synchronized void unpause() {
System.out.println("Method Unpause " + Thread.currentThread());
pause = false;
this.notifyAll();
System.out.println("///////////// ");
}
}Решение задачи: «Java FX – Поток приостанавливается некорректно»
textual
Листинг программы
synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK) {
LOCK.wait(); // LOCK is not held
}