2011-05-13 148 views
1

我有一个swing应用程序。点击菜单栏上的menuItem后,我试图进行API调用,这将需要一些时间。在SwingUtilities.invokeLater()中杀死一个线程

我不希望Swing应用卡住/挂起,直到API调用给出结果,所以我使用了SwingUtilities.invokeLater来分离出一个新产生的线程来处理API调用。以下是上述

public void actionPerformed(ActionEvent e){ 
    Object src=e.getSource(); 

    if(src.equals(theJMenuItemClicked)){ 
     SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         //apicall here 
        } 
       }) 
    } 

代码只要API调用线程运行我展示一个JDialog有消息说“进展API调用”和“中止线程”按钮。

我想通过单击Jdialog中的“ABort Thread”按钮来终止线程。

如果是普通线程,我们有一个Thread t = new Thread(new Runnable()),我们调用t.stop

如何获取由SwingUtilities产生的特定线程实例,以便我可以在其上调用一个停止点?用更简单的话来说,我怎样才能杀死上面创建的线程?

回答

0
public class SwingUtilitiesExample implements ActionListener { 

// Declaration of Swing Components 
private JMenuItem menuItem; 
private JButton abortOperation; 

// Thread-safe indicator of the presence of the Thread 
private volatile boolean isThreadRunning = false; 

public SwingUtilitiesExample() { 
    // Initialize Swing Components 
    menuItem = new JMenuItem(); 

    // Add ActionListeners 
    menuItem.addActionListener(this); 
    abortOperation.addActionListener(this); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    Object source = e.getSource(); 
    if (source.equals(menuItem)) { 
     isThreadRunning = true; 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       while (isThreadRunning) { 
        // API calls here 
       } 
      } 
     }); 
    } else if (source.equals(abortOperation)) { 
     isThreadRunning = false; 
    } 
} 
} 

通过将isThreadRunning的值更改为false,可以有效地中止线程。只要Thread定期检查这个布尔值,这个代码就可以正常工作。

方法Thread.stop()已弃用。 Oracle指出the method is inherently unsafe。因此,你应该避免使用它。如上面的代码示例所示,尝试使用线程安全布尔变量来控制线程的流向。

如果您在完成线程后正在考虑返回某种类型,则可能需要考虑SwingWorker类。