本来我写了界面,每个按钮的监听事件里写了好多代码,然后执行的时候按下按钮对对象进行操作。本来想法是一个按钮执行对象的具体流程,然后我们在另一个按钮里设置一个状态标识。这样,我们想改变程序状态时,只要按下改变程序状态的按钮就行了。但是,事实上这样行不通。在windowsbuilder建立的窗口上,我们的监听事件是建立在一个EventQueue.invokeLater run()上的建立的线程上的,我们的把对象执行流程主题放在一个监听按钮上时,我们其他的按钮根本就不能执行。出现锁死状态,也就是说,我们这样的设计根本实现不了对象执行的多状态,反而在对象执行过程中锁死一个按钮,导致他根本没用。
刚开始我也是一直想怎样用多线程实现这个状态变化,终于明白了。我们要向实现状态变化,就不能让我们的对象在监听事件里一直执行。我们只有把主体的对象执行流,放在监听事件之外,这样才不会卡死其他按钮监听事件。也就是说,我们不能在按钮事件中实现太多的代码,尽量简化才行。如果这样的话,那我们就只把状态标识的赋值放到按钮监听事件中,这样就不会出现其他按钮卡死的状态。而我们的主体对象执行流,放在监听事件线程之外,循环检测状态标识运行。两个线程同时运行,不用担心死锁同步问题,因为我们就是要让程序在两个线程中同时读写。其实准确说是一个写,一个读。
开始我还想怎么设计个锁,后来发现没必要,好像锁了也不好同步。例子如下:
package loginjsonclient;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Testconsole {
private JFrame frame;
static int num=0;
static String stat="";
static JTextArea textArea;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Testconsole window = new Testconsole();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
while(true){
switch(stat)
{
case "add1":
num++;
stat="";
break;
case "add2":
num++;
num++;
stat="";
break;
case "add3":
num=num+3;
stat="";
break;
default:
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
show(String.valueOf(num));
}
}
/**
* Create the application.
*/
public Testconsole() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JButton jbadd1 = new JButton("\u52A01");
jbadd1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
stat="add1";
}
});
jbadd1.setBounds(45, 28, 113, 27);
frame.getContentPane().add(jbadd1);
JButton jbadd2 = new JButton("\u52A02");
jbadd2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stat="add2";
}
});
jbadd2.setBounds(45, 101, 113, 27);
frame.getContentPane().add(jbadd2);
JButton button = new JButton("\u52A03");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stat="add3";
}
});
button.setBounds(45, 178, 113, 27);
frame.getContentPane().add(button);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(207, 13, 211, 198);
frame.getContentPane().add(scrollPane);
textArea = new JTextArea();
scrollPane.setViewportView(textArea);
}
public static void show(String str)
{
textArea.append(str);
textArea.append("\r\n");
}
}