简体   繁体   English

如何使用wait暂停线程并通知JavaFX

[英]How to pause a thread using wait and notify JavaFX

I am unclear on how to use wait() and notify() to pause a thread. 我不清楚如何使用wait()和notify()来暂停一个线程。 I read talk about synchronizing, but I'm unsure how to do it in my instance. 我读过有关同步的讨论,但我不确定如何在我的实例中执行此操作。 I have a music player with a progress bar where I want to pause the thread in control of syncing the progress bar with the music. 我有一个带进度条的音乐播放器,我想暂停线程以控制进度条与音乐的同步。 Here is the thread I want to pause: 这是我要暂停的主题:

@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
        });

Here is the second half where I also want to pause and start the thread: 这是下半场,我也想暂停并启动线程:

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
            }


        });

I will try to give you simple example and you try to apply it to your program... 我将尝试给你一个简单的例子,你试着将它应用到你的程序中......

    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();
    }
}

That's it.I hope this help you. 就是这样。我希望这对你有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM