使用较新的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变量来命令线程停止的方法?
它是否提供了暂停'一个线程,所以每次我停下来播放另一首歌都不需要创建一个新的线程吗?
我一直在使用较低级别的线程机制,我认为足够了,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
我一直在使用较低级别的线程机制,我认为足够......
不幸的是,最近Java中java.util.concurrent
或Java库的任何其他部分都没有提供新的机制。
您的选择是测试共享变量(volatile
或使用synchronized
)或使用Thread
中断机制。
暂停线程没有安全可靠的机制。要了解为何已阅读javadoc已弃用的Thread.suspend()
方法。如果你考虑一下,就没有一种安全可靠的方法来暂停线程。对于它的价值,我想不出任何其他语言(安全地)支持这种事情。
例如: