Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取代码当前运行的SwingWorker?_Java_Multithreading_Swing_Swingworker - Fatal编程技术网

Java 如何获取代码当前运行的SwingWorker?

Java 如何获取代码当前运行的SwingWorker?,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,如何获取代码当前运行的SwingWorker?您可以使用Thread.currentThread()获取Thread实例,但我需要SwingWorker实例 注释中的代码 private static void loadFeaturesForSym(final SeqSymmetry optimized_sym, final GenericFeature feature) throws OutOfMemoryE

如何获取代码当前运行的
SwingWorker
?您可以使用
Thread.currentThread()
获取
Thread
实例,但我需要
SwingWorker
实例

注释中的代码

private static void loadFeaturesForSym(final SeqSymmetry optimized_sym, 
                                       final GenericFeature feature) 
  throws OutOfMemoryError { 
  final CThreadWorker<Boolean, Object> worker = 
     new CThreadWorker<Boolean, Object>("Loading feature " + feature.featureName) { 
         @Override 
         protected Boolean runInBackground() { 
           try { 
             return loadFeaturesForSym(feature, optimized_sym); 
           } catch (Exception ex) { 
             ex.printStackTrace(); 
           } 
           return false; 
         } 
       }; 
       ThreadHandler.getThreadHandler().execute(feature, worker); 
     } 
   }
private static void loadfeatures forsym(最终序列对称优化),
最终通用功能(功能)
抛出OutOfMemoryError{
最终CThreadWorker=
新的CThreadWorker(“加载特性”+特性.featureName){
@凌驾
受保护的布尔值runInBackground(){
试试{
返回载荷特征ForSym(特征,优化的_-sym);
}捕获(例外情况除外){
例如printStackTrace();
} 
返回false;
} 
}; 
getThreadHandler().execute(功能,工作程序);
} 
}

我建议您创建一个模型对象,SwingWorker可以监听并通过发布和处理方法发送这些更新。您的其他对象不应该知道SwingWorker,他们应该只知道自己的进度,并将其发布给任何想要收听的人。这叫做脱钩。这里有一个想法,它使用了接近MVC的东西。我没有编译这段代码,但它有助于解释我所说的内容

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class ProcessStatus {
    public static final String PROGRESS = "Progress";

    private PropertyChangeSupport propertyChangeSupport;

    private int progress = 0;

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
        propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
    }

    public void setProgress(int progress) {
        int oldProgress = progress;
        this.progress = progress;
        firePropertyChange(PROGRESS, oldProgress, progress);
    }

    public int getProgress() {
        return progress;
    }
}

public class SomeWorker extends SwingWorker implements PropertyChangeListener {
    public void doInBackground() {
        ProcessStatus status = new ProcessStatus();
        status.addPropertyChangeListener(this);
        ProcessorThingy processor = new ProcessorThingy(status);
        processor.doStuff();
    }

    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals(ProcessStatus.PROGRESS)) {
            publish((Integer) evt.getNewValue());
        }
    }
}

public class ProcessorThingy {
    private ProcessStatus status;

    public ProcessorThingy(ProcessStatus status) {
        this.status = status;
    }

    public void doStuff() {
        //stuff part 1
        status.setProgress(10);
        //stuff part 2
        status.setProgress(50);
        //stuff part 3
        status.setProgress(100);
    }
}

Thread.currentThread().getName()
应该返回类似于
SwingWorker-pool-2-Thread-2
?您试图实现什么?(与您已经解释过的“您正在尝试做什么?”相反)尝试实现-SwingWorker正在执行一个长时间运行的流程,我想估计已完成工作的百分比,并将其应用于SwingWorker progress()/publish(),因为代码在
SwingWorker
内部运行,
保存当前的
SwingWorker实例
“由于代码在SwingWorker内部运行,因此它保存当前的SwingWorker实例”-如何从“this”获取SwingWorker实例?我现在做的是使用全局可访问的映射将线程链接到SwingWorker,因此,任何需要SwingWorker的代码都可以使用SwingWorker sw=globallyAccessibleMap.get(Thread.currentThread());我的直觉告诉我这是个坏主意,但我看不到你所有的代码,所以我可能错了。