Java 后台(SwingWorker)内的可运行线程?请帮忙
我正在开发一个客户端/服务器应用程序,其中我必须使用线程来阻止UI,该应用程序如下所示: 所以,问题是我不能在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
...
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中看到您的评论。