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

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

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

Всем привет. Пытаюсь написать симулятор чата, который генерирует сообщения в отдельном потоке. Этот поток мне нужно уметь создавать, приостанавливать и снова запускать его работу. Текущий код работает некорректно. Нажимаю на кнопку connect – запускается поток и сразу же встаёт в ожидание, как и требуется. Нажатие на unpause выводит его из режима ожидания, и поток симулирует генерацию сообщений. Если же нажимаю на pause, то гуи зависает, а сообщения продолжают генерироваться. В итоге поток всё-таки останавливается, но через неопределённое время. Может через секунду, а может через минуту и гуи соответственно тоже «отвисает». Чем больше читаю про wait и notify, тем больше не понимаю, почему не работает. Ведь у меня всего один второстепенный поток и его нужно всего лишь приостанавливать и снова запускать. Заранее благодарен за помощь. Прикладываю код и весь проект (eclipse). Starter
Листинг программы
  1. package application;
  2. import javafx.application.Application;
  3. import javafx.fxml.FXMLLoader;
  4. import javafx.stage.Stage;
  5. import javafx.scene.Scene;
  6. import javafx.scene.layout.AnchorPane;
  7.  
  8. public class Starter extends Application {
  9. public static void main(String[] args) {
  10. launch(args);
  11. }
  12. @Override
  13. public void start(Stage primaryStage) {
  14. try {
  15. AnchorPane root = (AnchorPane) FXMLLoader.load(getClass()
  16. .getResource("mainWindow.fxml"));
  17. Scene scene = new Scene(root, 400, 300);
  18. scene.getStylesheets().add(
  19. getClass().getResource("application.css")
  20. .toExternalForm());
  21. primaryStage.setScene(scene);
  22. primaryStage.show();
  23. } catch(Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
ClientController
Листинг программы
  1. package application;
  2. import javafx.fxml.FXML;
  3. import javafx.scene.control.Button;
  4. import javafx.scene.control.Label;
  5. public class ClientController {
  6. @FXML
  7. private Button btnConnect;
  8. @FXML
  9. private Button btnUnpause;
  10. @FXML
  11. private Button btnPause;
  12. @FXML
  13. private Label lblState;
  14. private ChatSimulator tm;
  15. @FXML
  16. private void connectChat() {
  17. tm = new ChatSimulator();
  18. tm.start();
  19. lblState.setText("Connected");
  20. }
  21. @FXML
  22. private void actUnpause() {
  23. tm.unpause();
  24. lblState.setText("Unpause");
  25. }
  26. @FXML
  27. private void actPause() {
  28. tm.pause();
  29. lblState.setText("Pause");
  30. }
  31. }
ChatSimulator
Листинг программы
  1. package application;
  2. public class ChatSimulator extends Thread {
  3. private boolean pause;
  4. public ChatSimulator() {
  5. pause = true;
  6. }
  7. @Override
  8. public void run() {
  9. while (true) {
  10. sendMessage();
  11. }
  12. }
  13. public synchronized void sendMessage() {
  14. try {
  15. if (pause) {
  16. System.out.println("Method sendMessage waits " + Thread.currentThread());
  17. wait();
  18. } else {
  19. System.out.println("Method sendMessage runs " + Thread.currentThread());
  20. sleep(1000);
  21. }
  22. } catch (InterruptedException exc) {
  23. exc.printStackTrace();
  24. }
  25. }
  26. public synchronized void pause() {
  27. System.out.println("Method Pause " + Thread.currentThread());
  28. pause = true;
  29. System.out.println("///////////// ");
  30. }
  31. public synchronized void unpause() {
  32. System.out.println("Method Unpause " + Thread.currentThread());
  33. pause = false;
  34. this.notifyAll();
  35. System.out.println("///////////// ");
  36. }
  37. }

Решение задачи: «Java FX – Поток приостанавливается некорректно»

textual
Листинг программы
  1. synchronized(LOCK) {
  2.     Thread.sleep(1000); // LOCK is held
  3. }
  4.  
  5.  
  6. synchronized(LOCK) {
  7.     LOCK.wait(); // LOCK is not held
  8. }

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


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

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

12   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы