如果你看一看一些多线程讲的比较多的书,你就会发现,由于swing 不保证线程安全性,swing的大多数的方法是不能被同步的方法。
好在,已经游人提供了对于这种问题打解决方案。(我看的时《java专业变成指南》

解决方案 »

  1.   

    我现在不清楚Swing的多线程是否能够引起该问题,难理解,如果是它引起的那就好说了,但现在问题的病因为找到阿!另外我们在一边找资料一边测试
      

  2.   

    记住在你的线程中不能操作任何swing组件。
      

  3.   

    另外CSDN好慢阿,我们换一个地方聊也行了,分照给,不够在加!
    http://www.javaresearch.org/forum/thread.jsp?column=286&thread=2344
      

  4.   

    我的线程当然有对Swing组件的操作,难道这就可能引起Swing的随机崩溃吗?
      

  5.   

    Swing组件只有少量方法,如setText是线程安全的,你的线程有对Swing组件操作完全可能引起Swing的随机崩溃。建议用EventQueue的invokeLater来调用你的线程,这样会由系统来决定同步问题。Core Java 卷2中就有一个非常不错的例子。如下
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;public class SwingThreadTest
    {  public static void main(String[] args)
       {  JFrame frame = new SwingThreadFrame();
          frame.show();
       }
    }class SwingThreadFrame extends JFrame
    {  public SwingThreadFrame()
       {  setTitle("SwingThread");
          setSize(400,300);
          addWindowListener(new WindowAdapter()
             {  public void windowClosing(WindowEvent e)
                {  System.exit(0);
                }
             } );
          model = new DefaultListModel();      JList list = new JList(model);
          JScrollPane scrollPane = new JScrollPane(list);      JPanel p = new JPanel();
          p.add(scrollPane);
          getContentPane().add(p, "South");      JButton b = new JButton("Good");
          b.addActionListener(new ActionListener()
             {  public void actionPerformed(ActionEvent event)
                {  new GoodWorkerThread(model).start();
                }
             });
          p = new JPanel();
          p.add(b);
          b = new JButton("Bad");
          b.addActionListener(new ActionListener()
             {  public void actionPerformed(ActionEvent event)
                {  new BadWorkerThread(model).start();
                }
             });
          p.add(b);      getContentPane().add(p, "North");
       }   private DefaultListModel model;
    }class BadWorkerThread extends Thread
    {  public BadWorkerThread(DefaultListModel aModel)
       {  model = aModel;
          generator = new Random();
       }   public void run()
       {  while (true)
          {  Integer i = new Integer(generator.nextInt(10));         if (model.contains(i))
                model.removeElement(i);
             else
                model.addElement(i);         yield();
          }
       }   private DefaultListModel model;
       private Random generator;
    }class GoodWorkerThread extends Thread
    {  public GoodWorkerThread(DefaultListModel aModel)
       {  model = aModel;
          generator = new Random();
       }   public void run()
       {  while (true)
          {  final Integer i = new Integer(generator.nextInt(10));
             EventQueue.invokeLater(new Runnable()
                {  public void run()
                   {  if (model.contains(i))
                         model.removeElement(i);
                      else
                         model.addElement(i);
                   }
                });
             yield();
          }
       }   private DefaultListModel model;
       private Random generator;
    }
      

  6.   

    楼上兄弟,非常感谢你的答复,我在没有怀疑其他地方的情况下,我也对这个无法控制的线程包一怀疑,我在不管问题是不是这个,我都要改调,不过我对Swing会引起Java崩溃,而且不抛任何异常的情况下退出,我非常纳闷,按道理来说,它应该抛java.lang.OutOfMemoryError或java.lang.ArrayIndexOutOfBoundsException异常啊
      

  7.   

    另外:在问一下,我准备用SwingUtilities或EventQueue来替换我原来的Swing线程,请给我一点建议。