【问题标题】:SwingWorker thread not close even the task is finished?即使任务完成,SwingWorker 线程也不会关闭?
【发布时间】:2011-09-12 04:23:50
【问题描述】:

我的 java 项目中有一个 swingworker。 我使用netbean“分析器”来监视线程。 我不知道为什么 Swingworker 线程仍然存在于 NetBeans 的分析器的监视器中,并且它处于“等待”状态。换句话说,如果我点击按钮 b 10 次,就有 10 个 swingworker 线程! 谢谢。

  public static void main(String[] args) {
    // TODO code application logic here
    final JFrame f = new JFrame();
    f.setLayout(new BorderLayout());
    f.setSize(400, 400);
    b = new JButton("B1");      
    f.add(b,BorderLayout.CENTER);
    b.addActionListener(new ActionListener() {           
        @Override
        public void actionPerformed(ActionEvent e) {
           new SwingWorker() {

                @Override
                protected Object doInBackground() throws Exception {
                    return null;
                }
            }.execute();
        }
    });

    f.setVisible(true);
}

【问题讨论】:

  • “不处置”是什么意思?那它不是GC'd?如果是这样,我认为我们无法完全控制这一点。您能否发布一个非常小的可编译、可运行的示例程序来演示该问题,SSCCE
  • 我不知道为什么 Thread 还处于等待状态,但我相信 SwingWorker 线程池中的线程不能超过 10 个。也许线程只是坐在池中等待在需要时再次使用(或者更好地说,“在池中涉水”?;))。

标签: java multithreading swing swingworker


【解决方案1】:

要详细说明我的评论,请查看此代码修改的输出:

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

public class Foo002 {

   public static void main(String[] args) {
      final JFrame f = new JFrame();
      f.setLayout(new BorderLayout());
      f.setSize(400, 400);
      JButton b = new JButton("B1");
      f.add(b, BorderLayout.CENTER);
      b.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            new SwingWorker() {

               @Override
               protected Object doInBackground() throws Exception {
                  Thread current = Thread.currentThread();
                  System.out.printf("ID: %d, Name: %s%n", current.getId(), current.getName());
                  System.out.println("Active Count: " + Thread.activeCount());
                  return null;
               }
            }.execute();
         }
      });

      f.setVisible(true);
   }
}

【讨论】:

  • 完全正确,根据我对您原始问题的 cmets。这就是 SwingWorker 线程池的大小。
【解决方案2】:

不,那不是SwingWorker 或类似的东西,请阅读tutorial,如何正确构造和使用SwingWorker,如果没有方法 done() 或错过对@987654324 的引用,请检查发生了什么@(复制自教程)SwingWorker worker = new SwingWorker<ImageIcon[], Void>()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多