Java 监视线程状态的规范方法

Java 监视线程状态的规范方法,java,swing,scala,concurrency,progress-bar,Java,Swing,Scala,Concurrency,Progress Bar,我正在使用Scala在Swing中编写一个GUI应用程序,它启动多个线程,通过HTTP并发下载文件。我想使用一些JProgressBars来显示下载的状态。显然,进度条必须从事件调度线程更新,此外,我希望将HTTP下载代码与GUI分开 我想知道最好的方法是什么SwingWorker是Swing特定的,Observable似乎有些过时,因为传递给观察者的参数是一个对象,必须强制转换。Scala是一种功能强大的现代语言,所以我希望有一种更简单的方法来完成我想要的任务。让下载的类接受一个Propert

我正在使用Scala在Swing中编写一个GUI应用程序,它启动多个线程,通过HTTP并发下载文件。我想使用一些
JProgressBar
s来显示下载的状态。显然,进度条必须从事件调度线程更新,此外,我希望将HTTP下载代码与GUI分开


我想知道最好的方法是什么
SwingWorker
是Swing特定的,
Observable
似乎有些过时,因为传递给观察者的参数是一个对象,必须强制转换。Scala是一种功能强大的现代语言,所以我希望有一种更简单的方法来完成我想要的任务。

让下载的类接受一个PropertChangeListener,并通知下载进度。监听器会相应地更新进度条。

通过使用Scala闭包实现自己的监听器回调系统,我实现了自己想要的功能。下载类中包含以下代码:

val listeners = new ListBuffer[Int => Unit]

def registerListener(f: Int => Unit) {
  if (!listeners.contains(f)) {
    listeners.append(f)
  }
}
这在GUI中的嵌套SwingWorker中进行:

downloader.registerListener(this.listener)

def listener(progress: Int) {
  SwingUtilities.invokeLater(new Runnable {
    def run() {
      progressBar.setValue(progress)
      table.repaint()
    }
  })
}

可能重复,并且addPropertyChangeListener是java.awt.Component的成员,我正在寻找一种不使用GUI库的方法来实现这一点。