我正在创建一个 Swing 应用程序。它包含一个 JFrame,在 JFrame 内部,我添加了一个 JButton 来启动和停止一些任务。我正在使用相同的 JButton 来启动和停止作为线程并由 ExecutorService 执行的任务。
单击开始按钮时,将执行线程并且按钮标签将更改为停止,而单击停止按钮将停止所有线程(我已使用 ExecutorService shutdownNow() 方法完成此操作)并且按钮标签将再次出现更改为开始,但应用程序不会关闭。现在,如果我再次单击“开始”按钮,应用程序将被挂起,线程不会从头开始重新启动。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MultipleThreads {
public static ExecutorService executor = Executors.newFixedThreadPool(4);
public static void main(String[] args) {
JFrame frame = new JFrame("Stop Thread");
frame.setSize(200,200);
frame.setLocationRelativeTo(null);
frame.setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(5,5,150,150);
panel.setLayout(null);
JButton btn = new JButton("Start");
btn.setBounds(10,10,80,25);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (btn.getText().equals("Start")) {
btn.setText("Stop");
MultipleThreads2 runThreads = new MultipleThreads2();
runThreads.runThreadMethod();
} else if (btn.getText().equals("Stop")) {
try {
if (!executor.awaitTermination(800, TimeUnit.MILLISECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
}
btn.setText("Start");
}
}
});
panel.add(btn);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
预期:第二次单击“开始”按钮时,应从头开始重新启动所有线程。
叮当猫咪
相关分类