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