Java 后台(SwingWorker)内的可运行线程?请帮忙

Java 后台(SwingWorker)内的可运行线程?请帮忙,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,我正在开发一个客户端/服务器应用程序,其中我必须使用线程来阻止UI,该应用程序如下所示: 所以,问题是我不能在SwingWorker中指定优先级,所以我所做的是: ... SwingWorker<String, Object> sw = new SwingWorker<String, Object>() { @Override public String d

我正在开发一个客户端/服务器应用程序,其中我必须使用线程来阻止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();
                        }
    }


...
。。。
SwingWorker sw=新SwingWorker(){
@凌驾
公共字符串doInBackground(){
//比如说
螺纹t1=新螺纹(jprogressbar);
t1.设置优先级(线程最大优先级);
t1.start();
}
}
...
正如您所看到的,它看起来很奇怪,因为线程正在更新JProgressBar,所以我只想创建多个任务(线程)并更新JProgressBar,但我想知道最好的方法,因为我非常确定我没有做正确的事情,因为正如您所知,swing不是线程安全的,所以我使用了SwingWorker。应用程序运行得很好,但我只是想知道是否有更好的方法来实现这一点

谢谢你,如果你能回答我,我将不胜感激

截图:


我认为您可以使用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来为这个事件列表

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
  }
});
从:

因为
SwingWorker
实现了
Runnable
,所以
SwingWorker
可以提交给
执行者执行

因此,如果您希望控制最终将执行
doInBackground()
方法而不是使用默认Swing worker线程的后台
Thread
,则明确允许使用
SwingWorker
实现
可运行
的事实,而不是调用其
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();
SwingWorker sw=新SwingWorker(){
@凌驾
公共字符串doInBackground(){
//在这里做真正的工作
}
//根据需要重写其他方法
}
//不要调用sw.execute(),而是自己启动后台线程:
螺纹t1=新螺纹(sw);
t1.设置优先级(线程最大优先级);
t1.start();
当然,也可以使用
执行器
以及建议的文档。您可以实现自己的创建高优先级线程的
Executor
,也可以使用
ThreadPoolExecutor
,并提供一个定制的
ThreadFactory
,该线程工厂可生成高优先级线程

然后,如果您有一个
Executor e
,您可以使用
e.execute(sw)启动后台处理



作为一个旁注,你应该考虑线程优先级是一个提示而不是一个重要的属性。特别是高于正常优先级对大多数实现没有影响…

你可以共享一个屏幕截图链接。我更新了帖子,谢谢。为任意数量的线程创建线程池,并在每个线程上调用start…,并同步该run块方法以确保线程安全。在遇到问题之前,您可能需要确保您需要这个。我曾经和SwingWorker一起使用过进度条,而且我从来没有觉得有必要去打乱优先级。最容易实现和调试的编程是您不必做的事情。@rcook这不是为了一个真正的项目,我不会使用优先级,但他们希望我这样做。不需要额外的
PropertyChangeSupport
;worker的
setProgress()
方法已通知侦听器。是的,但他没有直接使用SwingWorker,他正在SwingWorker内部使用线程,没有必要;侦听器“在事件调度线程上异步通知”。@tiagohng抱歉,我没有在propertyChange中看到您的评论。