现代Java并发

时间:2015-02-21 07:47:30

标签: java multithreading

使用较新的Java抽象,你如何使线程“停止”?

例如,媒体播放器播放MP3文件并有一个暂停按钮,所以使用较旧的Java,您可能(大致)有这样的类:

 volatile boolean stopPlaying = false;

 new Thread(() - > {
    void play() {
        stopPlaying = false;
        while(songHasntEnded && !stopPlaying) {
            //decode next part of song and play
        }
    }
}).start();

并且动作监听器的停止按钮可能包含:

void stop() {
        stopPlaying = true;
        //close file etc
}

如何使用java.util.concurrent实现这种情况(或者更常见的情况,我不会尝试重新发明mp3播放器)?

它是否提供了一种避免使用volatile变量来命令线程停止的方法?

它是否提供了暂停'一个线程,所以每次我停下来播放另一首歌都不需要创建一个新的线程吗?

我一直在使用较低级别的线程机制,我认为足够了,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

  

我一直在使用较低级别的线程机制,我认为足够......

不幸的是,最近Java中java.util.concurrent或Java库的任何其他部分都没有提供新的机制。

您的选择是测试共享变量(volatile或使用synchronized)或使用Thread中断机制。

暂停线程没有安全可靠的机制。要了解为何已阅读javadoc已弃用的Thread.suspend()方法。如果你考虑一下,就没有一种安全可靠的方法来暂停线程。对于它的价值,我想不出任何其他语言(安全地)支持这种事情。

例如: