繁体   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