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
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д