簡體   English   中英

多個線程無法同時工作

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM