我有一个挥杆应用程序。单击菜单栏上的menuItem后,我正在尝试进行API调用,这可能需要一些时间。
我不想让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 :(得分: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。因此,您应该避免使用它。尝试使用线程安全的布尔变量来控制线程的流程,如上面的代码示例所示。
如果您在完成Thread之后想要返回某种类型,则可能需要考虑SwingWorker
类。