下面的play
方法来自一个类,该类在实例化时将 .wav 文件读入一个名为 的字节数组data
,并将声音格式存储在一个AudioFormat
名为 的对象中format
。
我有一个play
从java.util.Timer
. 当我进入包含所有相关 .class 文件的文件夹并使用命令运行程序时java MainClass
,一切都按预期工作。但是,当我将所有 .class 文件放入可执行 .jar 并使用 command 运行程序时java -jar MyProgram.jar
,使用该方法播放的声音会在play
50 到 150 毫秒后被切断。
public void play() throws LineUnavailableException {
final Clip clip = (Clip)AudioSystem.getLine(new DataLine.Info(Clip.class, format));
clip.open(format, data, 0, data.length);
new Thread() {
public void run() {
clip.start();
try {
Thread.sleep(300); // all sounds are less than 300 ms long
} catch (InterruptedException ex) { /* i know, i know... */ }
clip.close();
}
}.start();
}
几点评论:
我尝试将
play
方法中的睡眠时间增加到 1000 毫秒,而行为没有改变。计时
Thread.sleep
使用System.nanoTime
确认线程完全按照预期的时间休眠。由于要播放的声音文件已预先加载到内存中,因此我认为从 .jar 中提取声音资源的行为不会导致问题。
我尝试使用内存池大小选项
-Xms2m
和-Xmx64m
(单独)从 jar 内部和外部运行程序,但行为没有变化。
我在 Ubuntu 11.04 上运行 OpenJDK Java 6。知道发生了什么吗?