[英]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.