java - 多个线程不能同时工作

标签 java multithreading swing

我有一个 java 程序,在其中使用 TTS(文本到语音),同时我希望在屏幕上显示一个动画 gif。我正在使用 Netbeans GUI 构建器,因此我创建了一个新的 jpanel 表单,并在该表单(java jpanel 表单)的标签中添加了 gif,之后我添加了这个java作为我的主java文件的jpanel(通过拖放)。但问题是,一旦 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,它证实了我的想法。

Voice 上的 speak 方法会阻塞,直到语音文本完成。方法 speak(String) 调用 speak(FreeTTSSpeakable talkable),其中包含以下 Javadoc:

Speak the given queue item. This is a synchronous method that does not return until the speakable is completely spoken or has been cancelled.

但是,在 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 了解更多信息。

关于java - 多个线程不能同时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23707808/

相关文章:

java - JApplet 行为异常

java - 如何从 URL 对象创建文件对象(图像)

java - Prepared 语句的 executeQuery() 方法的执行时间与相应的存储过程执行时间

java - Eclipse 未发布到 Apache 6.0.32 - 无法发布到服务器

python - 为什么我的 Python 程序的输出看起来像这样(很奇怪)?

java - 在 Java 中绘制线条以创建单元格

java - Spark 数据集 : Reduce, 数据集的 Agg、Group 或 GroupByKey <Tuple2> Java

java - 建议将 Handler 与 EventBus/Otto 一起使用?

c# - Thread.Sleep(300) 无法正常工作

java - 如何在 CardLayout 中显示不同的卡片?