在多线程的Swing GUI应用程序中,使用两个按钮来启动和停止线程涉及到对线程的正确管理和Swing组件的事件处理。以下是实现这一功能的基础概念和相关步骤:
SwingWorker
或实现Runnable
接口。import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ThreadControlGUI extends JFrame {
private JButton startButton;
private JButton stopButton;
private MyTask task;
private ExecutorService executor;
public ThreadControlGUI() {
startButton = new JButton("Start");
stopButton = new JButton("Stop");
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startTask();
}
});
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
stopTask();
}
});
JPanel panel = new JPanel();
panel.add(startButton);
panel.add(stopButton);
add(panel);
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
executor = java.util.concurrent.Executors.newSingleThreadExecutor();
}
private void startTask() {
if (task == null || task.isDone()) {
task = new MyTask();
executor.execute(task);
}
}
private void stopTask() {
if (task != null) {
task.cancel(true);
}
}
private class MyTask extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
while (!isCancelled()) {
// 执行后台任务
System.out.println("Task is running...");
Thread.sleep(1000);
}
return null;
}
@Override
protected void done() {
System.out.println("Task is done.");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ThreadControlGUI();
}
});
}
}
SwingWorker
可以将后台任务与UI更新逻辑分离。SwingWorker
确保所有对Swing组件的访问都在EDT中进行。ExecutorService
提供了一种简洁的方式来管理和控制线程。SwingUtilities.invokeLater()
。isCancelled()
方法定期检查任务是否应该停止,并及时响应取消请求。通过上述步骤和示例代码,可以实现一个简单的Swing GUI应用程序,其中包含启动和停止线程的功能。
领取专属 10元无门槛券
手把手带您无忧上云