如何使用等待并通知Javafx暂停线程



我尚不清楚如何使用wait((和notify((暂停线程。我读了关于同步化的谈论,但在我的情况下我不确定该怎么做。我有一个带有进度栏的音乐播放器,我想在其中暂停将进度栏与音乐同步的线程。这是我要暂停的线程:

@FXML private void clickedButton(ActionEvent event){
        shuffle.setOnAction(e -> {

            artistPane.setText(model.getCurrentSong());

                if(firstTime){
                    //Multithreading with JavaFX. Essentially this other thread will check the slider to make sure its on track.
                    sliderThread = new Task<Void>() {
                        @Override
                        protected Void call() throws Exception {
                            boolean fxApplicationThread = Platform.isFxApplicationThread();
                            System.out.println("Is call on FXApplicationThread: " + fxApplicationThread);

                            //this is an infinite loop because now I only need to make this thread once, pausing and starting it, as opposed to making many threads
                            for(;;){
                                Thread.sleep(100);
                                progressBar.setValue(controller.getPercentageDone());
                            }

                        }
                    };
                    new Thread(sliderThread).start(); 
                    firstTime = false;
                }else if(!model.getIsPlaying()){
                    //I want to start the thread here
                }
                controller.shuffle(); //this will start the music on the next song
        });

这是我也想暂停并启动线程的下半年:

play.setOnAction(e -> {
            controller.play(); //this will pause/start the music
            if(!model.getIsPlaying()){
                //where I want to pause the thread.
            }else{
                //I want to start the thread here
            }

        });

我会尝试为您提供简单的例子,然后尝试将其应用于您的程序...

    public class TestClass extends JPanel {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Thread playThread ;
    TestClass() {
         playThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("DO SOME THING HERE");
                System.out.println("SONG WILL PLAY.....");

            }
        });
    }
    public void startMyPlayer() {
        System.out.println("PLAYING NOW...");
        playThread.start();
    }
    public void pauseMyPlayer() throws InterruptedException {
        System.out.println("PAUSED NOW...");
        playThread.wait();
    }
    public void resumeMyPlayer() {
        System.out.println("RESUMING NOW...");
        playThread.notify();
    }
}

就是这样。我希望这对您有帮助。

最新更新