import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MoreThreadQiu extends Thread implements ActionListener{
public MoreThreadQiu(){super();}
public MoreThreadQiu(String s){super(s);}
MoreThreadQiu t1,t2;
JFrame win = new JFrame("多线程实例");
Container contentPane = win.getContentPane();
JLabel labRed = new JLabel("当前红色小球的个数:");
JLabel labBlue = new JLabel("当前蓝色小球的个数:");
JTextField txtRed = new JTextField(8);
JTextField txtBlue = new JTextField(8);
JButton qidong = new JButton("启动线程");
int countRed = 0,countBlue = 0;
String str;
public void go(){
qidong.addActionListener(this);
contentPane.setLayout(null);
labRed.setBounds(10,20,160,30);
        labBlue.setBounds(10,50,160,60); 
        txtRed.setBounds(170,20,120,30);
        txtBlue.setBounds(170,70,120,30);
        qidong.setBounds(110,120,100,40);       
        contentPane.add(labRed);
        contentPane.add(labBlue);
        contentPane.add(txtRed);
        contentPane.add(txtBlue);
        contentPane.add(qidong);
        win.setSize(320,200);
        win.setVisible(true);        
}
public void run(){
while(true){
System.out.println("红色:"+txtRed.getText());
System.out.println("蓝色:"+txtBlue.getText());
txtRed.setText(countRed+"个");
txtBlue.setText(countBlue+"个");
try{sleep((int)(Math.random()*2000));}
catch(Exception e){}
str = currentThread().getName();
if(str.equals("red")){countRed++;}
if(str.equals("blue")){countBlue++;}
}
}
public void actionPerformed(ActionEvent arg0) {
t1 = new MoreThreadQiu("red");
t2 = new MoreThreadQiu("blue");
t1.start();
t2.start();
}
public static void main(String arg[]){
MoreThreadQiu be = new MoreThreadQiu();
be.go();
}
}
特简单,线程就是要进行草某两个变量的累加,然后把累加的结果显示到窗口的两个文本框中,但是就是显示不上去。加了测试语句会,发现线程确实是在运行,而且以在DOS下显示。请高手指教。不是线程本身的问题,而是向窗口中的文本框加数据时出问题了。

解决方案 »

  1.   

    原因是这样的:Swing包下的组件不是线程安全的。如果需要访问,修改组件的状态,需要在EDT(Event dispatch Thread)线程下去做。简单地做法是调用SwingUtilities.invokelater(new Runnable(){
                 txtRed.setText(countRed+"个");
                 txtBlue.setText(countBlue+"个");   
    });
      

  2.   

    看这个文章http://blog.csdn.net/helloxtayfnje/archive/2010/04/08/5461429.aspx你的start不可以写在按钮事件里,否则这个事件没完的话,event-dispatching thread会等到全部结束才会更新你的TextField。(照你的例子,不可能全部结束,所以不会更新组件)