【问题标题】:Multiple threads not working simultaneously多个线程不能同时工作
【发布时间】:2014-05-17 05:08:50
【问题描述】:

我有一个 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);

【问题讨论】:

  • Downvoter 是否愿意发表评论?
  • 我们遗漏了一些内容:“您的 TTS 使用了哪个 API 和实现?”和“你是如何调用 TTS 的?”。特别是,如果您从 Swing UI 线程调用 TTS,并且您的 TTS API 在线程说话时阻塞了该线程,则 UI 中的任何内容都不会更新 - 如果是这种情况,您需要在不同的线程上说话。
  • @ErwinBolwidt 我不知道你写了什么,但我会尽力给你这些信息,我会展示我正在做 TTS 的代码
  • @ErwinBolwidt 你还想要什么?
  • 注意我没有对这个问题投票。一件事很可能,但我不能 100% 确定——这段代码是如何调用的?是来自 ActionListener 还是其他事件侦听器?

标签: java multithreading swing


【解决方案1】:

我不得不查找 FreeTTS Javadoc,这证实了我的想法。

Voice 上的 speak 方法会阻塞,直到语音文本完成。方法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 了解更多信息。

【讨论】:

  • 为什么不在单独的线程中运行动画 gif?因为我会在循环中使用 TTS,而动画 gif 只是偶尔启动一次
  • 您不能使用 UI 线程来说话和另一个线程来绘图 - Swing 使用单线程模型来处理 UI,并且需要它来进行 UI 交互。但是您可以将所有与语音相关的工作保留在一个单独的线程上,当您需要与 UI 交互时,您可以使用EventQueue.invokeLater。在 SO 上查看许多其他 Q:stackoverflow.com/questions/19167154/…stackoverflow.com/questions/5544447/…
猜你喜欢
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2017-03-04
  • 2021-05-13
  • 2015-03-02
相关资源
最近更新 更多