doInBackground(SwingWorker)里面的runnable线程?请帮忙

时间:2014-05-14 19:32:00

标签: java multithreading swing swingworker

我正在开发一个客户端/服务器应用程序,我必须使用线程来阻止UI,应用程序看起来像:

所以,问题是我无法在SwingWorker中指定优先级,所以我所做的是:

...

        SwingWorker<String, Object> sw = new SwingWorker<String, Object>() {

                        @Override
                        public String doInBackground() {

                       //For example
                       Thread t1 = new Thread(jprogressbar);
                       t1.setPriority(Thread.MAX_PRIORITY);
                       t1.start();
                        }
    }


...

你可以看到它看起来很奇怪,因为线程正在更新JProgressBar,所以我只想创建多个任务(线程)并更新JProgressBar,但我想知道最好的方法来做到这一点,因为我很确定我做的不对,因为你知道,swing不是线程安全的,所以我使用了SwingWorker。该应用程序工作得很好,但我只是想知道是否有更好的方法来做到这一点?

谢谢,我很感激任何答案。

截图:

enter image description here

2 个答案:

答案 0 :(得分:0)

我认为您可以使用PropertyChangeListener。 您可以创建一个从Thread扩展的类,如下所示:

public abstract class UIProcess extends Thread {

    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public void setStatus(int percentage) {
        pcs.firePropertyChange("status", 0, percentage);
    }

    public void addStatusChangeListener(PropertyChangeListener listener) {
        this.pcs.addPropertyChangeListener(listener);
    }
}

然后您可以将SwingWorker注册到listem以用于此事件。

Thread t = new UIProcess(...);
t.addStatusChangeListener(new PropertyChangeListener() {
  @Override
  public void propertyChange(PropertyChangeEvent evt) {
      int  newStatus = (Integer) evt.getNewValue();
      //here you can update your progress bar, with a synchronized method if you think this is necessary
  }
});

答案 1 :(得分:0)

来自SwingWorker’s class documenation

  

由于SwingWorker实施RunnableSwingWorker可以提交给Executor执行。

因此,如果您希望控制最终将执行Thread方法的后台doInBackground()而不是使用默认的Swing工作线程,则明确允许使用{{1}的事实实现SwingWorker而不是调用其Runnable方法:

execute()

但当然,可以使用SwingWorker<String, Object> sw = new SwingWorker<String, Object>() { @Override public String doInBackground() { // do the real work here } // override other methods as needed } // instead of calling sw.execute() start the background thread yourself: Thread t1 = new Thread(sw); t1.setPriority(Thread.MAX_PRIORITY); t1.start(); 以及建议的文档。您可以实现自己的Executor创建高优先级线程或使用Executor并提供生成高优先级线程的自定义ThreadPoolExecutor

然后,如果您有ThreadFactory,则可以使用Executor e开始后台处理。


作为旁注,您应该将线程优先级视为提示而不是重要属性。特别是高于正常的优先级对大多数实现都没有影响......