Multithreading 在SwingUtilities.invokeLater()中终止线程
我有一个swing应用程序。单击菜单栏上的菜单项时,我正在尝试进行API调用,这可能需要一些时间 在API调用给出结果之前,我不希望Swing应用程序被卡住/挂起,因此我使用SwingUtilities.invokeLater分离出一个新生成的线程,该线程将负责API调用。以下是上述代码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
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()
。甲骨文说。因此,你应该避免使用它。尝试使用线程安全的布尔变量来控制线程流,如上面的代码示例所示
如果你在完成线程后正在考虑返回某种类型,你可能想考虑类。