【问题标题】:New to threads need advice in java线程新手需要java中的建议
【发布时间】:2012-10-21 00:40:51
【问题描述】:

我正在写一个音乐播放器。当我从外部音乐文件中读取数据时,我会用幅度信息填充缓冲区。因为我认为将这个阻塞操作生成到它自己的线程中是有意义的,所以我添加了一个在 runnable 中运行它的接口:

public class AudioInterface implements Runnable {

 public void run() 
 {
    AudioManager am = new AudioManager();
    am.play("res/sample2.mp3");
 }
}

这是我的以下问题:

  • 如何从另一个类创建一个挂钩来轮询幅度数据?我需要它来编写将绘制到 JPanel 画布上的算法。
  • 启用可视化的面板是否也应位于不同的线程中?
  • 目前 run() 只包含播放文件,既然只有一个 run 动作,我如何将此线程用于其他动作,例如摆姿势和寻找等。

谢谢

【问题讨论】:

    标签: java swing concurrency


    【解决方案1】:

    一些想法:

    如何从另一个类创建一个钩子来轮询幅度数据?我需要它来编写将绘制到 JPanel 画布上的算法。

    由于这是一个 Swing 程序,请考虑为您的后台线程使用 SwingWorker,然后通过 SwingWorker 的发布/处理方法对将幅度数据泵入程序的 GUI 部分。

    启用可视化的面板是否也应该在不同的线程中?

    这里要小心。所有 Swing 代码都应该在一个线程上调用,并且只能在一个线程上调用,即事件调度线程。请看一下这方面的教程,Concurrency in Swing

    目前 run() 只包括播放文件,我将如何使用这个线程进行其他操作,例如摆姿势和寻找等。

    您不为此使用“线程”,而是调用对象的方法。

    此外,您可能希望将 AudioManager 变量声明为类字段,而不是局部变量,因为否则它的范围仅限于声明它的方法,从而阻止其他代码与之交互。

    【讨论】:

    • 我明白了,谢谢。对于你提出的最后一点,我理解 AudioManager 应该是一个类变量,所以你认为我应该在这个接口中创建方法,这些方法会影响 对象在线程中执行时的行为?
    • @Pat:是的,我认为你没有选择的余地。如果多个对象将尝试影响 AudioManager 对象的状态并且可能同时影响,那么这些方法可能必须同步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多