我正在开发一个客户端/服务器应用程序,我必须使用线程来阻止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。该应用程序工作得很好,但我只是想知道是否有更好的方法来做到这一点?
谢谢,我很感激任何答案。
截图:
答案 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
实施Runnable
,SwingWorker
可以提交给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
开始后台处理。
作为旁注,您应该将线程优先级视为提示而不是重要属性。特别是高于正常的优先级对大多数实现都没有影响......