Java FX – Поток приостанавливается некорректно

Узнай цену своей работы

Формулировка задачи:

Всем привет. Пытаюсь написать симулятор чата, который генерирует сообщения в отдельном потоке. Этот поток мне нужно уметь создавать, приостанавливать и снова запускать его работу. Текущий код работает некорректно. Нажимаю на кнопку connect – запускается поток и сразу же встаёт в ожидание, как и требуется. Нажатие на unpause выводит его из режима ожидания, и поток симулирует генерацию сообщений. Если же нажимаю на pause, то гуи зависает, а сообщения продолжают генерироваться. В итоге поток всё-таки останавливается, но через неопределённое время. Может через секунду, а может через минуту и гуи соответственно тоже «отвисает». Чем больше читаю про wait и notify, тем больше не понимаю, почему не работает. Ведь у меня всего один второстепенный поток и его нужно всего лишь приостанавливать и снова запускать. Заранее благодарен за помощь. Прикладываю код и весь проект (eclipse). Starter
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();
        }
    }
 
}
ClientController
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");
    }
}
ChatSimulator
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
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы