Multithreading 在SwingUtilities.invokeLater()中终止线程

Multithreading 在SwingUtilities.invokeLater()中终止线程,multithreading,swing,swingutilities,Multithreading,Swing,Swingutilities,我有一个swing应用程序。单击菜单栏上的菜单项时,我正在尝试进行API调用,这可能需要一些时间 在API调用给出结果之前,我不希望Swing应用程序被卡住/挂起,因此我使用SwingUtilities.invokeLater分离出一个新生成的线程,该线程将负责API调用。以下是上述代码 public void actionPerformed(ActionEvent e){ Object src=e.getSource(); if(src.equals(theJMenuItem

我有一个swing应用程序。单击菜单栏上的菜单项时,我正在尝试进行API调用,这可能需要一些时间

在API调用给出结果之前,我不希望Swing应用程序被卡住/挂起,因此我使用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中的“中止线程”按钮时终止线程

如果它是一个普通线程,我们有一个
thread t=new thread(new Runnable())
,并在同一个线程上调用
t.stop

我如何获得由SwingUtilities生成的特定线程实例,以便对其进行停止?简单地说,我如何杀死上面创建的线程

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.stop()
。甲骨文说。因此,你应该避免使用它。尝试使用线程安全的布尔变量来控制线程流,如上面的代码示例所示

如果你在完成线程后正在考虑返回某种类型,你可能想考虑类。