Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 在swing worker中,是否可以终止线程?_Java_Swingworker - Fatal编程技术网

Java 在swing worker中,是否可以终止线程?

Java 在swing worker中,是否可以终止线程?,java,swingworker,Java,Swingworker,我使用swing worker线程以后台模式加载数据。下面是例行程序的简化版本。重要的一点是,work2会一直保存对象,直到线程完成,然后work2会得到一个空值 我可能期望垃圾收集删除线程,但我在调试器中看到SwingWorker-pool-1-thread-1-running。从我的观点来看,我不再使用该线程,因为加载已经完成 我最好还是忽略线程仍在运行这一事实,但我还是想问一下。是否需要显式终止线程?我还没有寻找显式命令来实现这一点,因为我习惯于将对象设置为null,一旦没有更多的引用,J

我使用swing worker线程以后台模式加载数据。下面是例行程序的简化版本。重要的一点是,work2会一直保存对象,直到线程完成,然后work2会得到一个空值

我可能期望垃圾收集删除线程,但我在调试器中看到SwingWorker-pool-1-thread-1-running。从我的观点来看,我不再使用该线程,因为加载已经完成

我最好还是忽略线程仍在运行这一事实,但我还是想问一下。是否需要显式终止线程?我还没有寻找显式命令来实现这一点,因为我习惯于将对象设置为null,一旦没有更多的引用,Java就会为我杀死一些东西

那么,最好的建议是什么?杀了它还是忽略它

谢谢, 宜兰

protectedvoid LoadData(PetCtFrame par1,ArrayList imgList,ArrayListseriesType){
work2=新的bkgdLoadData();
工作2.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废属性更改(属性更改事件evt){
字符串propertyName=evt.getPropertyName();
if(propertyName.equals(“state”)){
SwingWorker.StateValue状态=(SwingWorker.StateValue)evt.getNewValue();
if(state==SwingWorker.StateValue.DONE){
work2=null;
}
}
}
});
work2.execute();
}

首次使用
SwingWorker
后,其池将被初始化,通常无需对其进行管理


至于您提到的垃圾收集,这与线程管理无关。
Thread
对象不是线程,它只是一个句柄对象,允许您启动和管理执行线程的生命周期。只要底层线程启动,
线程
实例就可以作为
线程.currentThread()
静态访问,因此只要线程处于活动状态,实例就不会进行垃圾收集。

SwingWorker被指定用于Swing/和/或dirty hack将初始化EDT
protected void LoadData(PetCtFrame par1, ArrayList<ImagePlus> imgList, ArrayList<Integer>seriesType) {
    work2 = new bkgdLoadData();
    work2.addPropertyChangeListener(new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            String propertyName = evt.getPropertyName();
            if( propertyName.equals("state")) {
                SwingWorker.StateValue state = (SwingWorker.StateValue) evt.getNewValue();
                if( state == SwingWorker.StateValue.DONE) {
                    work2 = null;
                }
            }
        }
    });
    work2.execute();
}