即使任务完成,SwingWorker线程也不会关闭?

时间:2011-09-12 04:23:51

标签: java multithreading swing swingworker

我的java项目中有一个swingworker。 我使用netbean“profiler”来监视线程。 我不知道为什么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);
}

2 个答案:

答案 0 :(得分:7)

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

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);
   }
}

答案 1 :(得分:2)

不是,那不是SwingWorker或类似的东西,请阅读tutorial,如何正确构建和使用SwingWorker,如果没有方法完成,检查发生了什么()或错过参考Future<?>(从教程中复制)SwingWorker worker = new SwingWorker<ImageIcon[], Void>()