[英]Multiple threads not working simultaneously
我有一个Java程序,其中正在使用TTS(文本到语音),并且还希望在屏幕上显示动画gif。 我正在使用Netbeans GUI构建器,因此我制作了一个新的jpanel form
并以该表单(java jpanel表单)的标签添加了gif
,然后我将此Java作为jpanel添加到了我的主要Java文件中(通过拖动和删除)。 但是问题在于,一旦TTS开始说话,它就会停止gif动画。 如何使其协同工作? 注意:我正在使用freeTTS将文本转换为语音
码:
private static final String VOICENAME = "kevin16";
VoiceManager voiceManager = VoiceManager.getInstance();
.....
........
Voice voice;
voice = voiceManager.getVoice(VOICENAME);
voice.allocate();
....//Some code here
t4.setText("" + ran);
voice.speak(t4.getText());
listenanum.setText("" + d);
listenanum.setVisible(false);
我必须查找FreeTTS Javadoc,这证实了我的想法。
该speak
的方法, Voice
阻塞,直到所说的文字就完成了。 方法speak(String)
调用speak(FreeTTSSpeakable speakable)
,它具有以下Javadoc:
说出给定的队列项目。 这是一种同步方法,直到完全说出或已取消说出语音后才返回。
但是,在Swing中,只要您在UI线程中做一件事情,它就无能为力。 因此您的动画将停止,因为它也需要UI线程来重新绘制图像。
解决此问题的最佳方法也许是更深入地研究语音API,并在Voice
上使用processUtterance(Utterance u)
方法。 该方法是异步的。 当语音在其他语音输出线程上完成时,它将立即返回。
但是,一种更简单的解决方法是在另一个线程上调用speak
方法。
final String textToSpeak = t4.getText();
Thread speechThread = new Thread(new Runnable() {
public void run() {
voice.speak(textToSpeak);
}
});
speechThread.start();
实际上,使用线程池比每次启动一个新线程要好,但这超出了您的直接问题。 您可以搜索StackOverflow或查看java.util.concurrent.ThreadPoolExecutor
以获取更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.