一个非常不明白的Swing问题

xuwanhong 2002-09-16 10:42:51
我遇到一个很难发现的问题,我在Swing中用到了多线程的问题(但我认为Swing可以使用多线程,我现在也这样认为),问题是Swing偶尔会不知不觉得关闭,我不明白,而且不抛任何异常,另外这个机率太小,使用四台计算机进行测试两三天,只在一台计算机上发现一次,它的计算机配置是CPU4,请大家帮我出出主意,或如果有遇到该问题的同僚一起来来谈谈经过
...全文
40 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuwanhong 2002-09-16
  • 打赏
  • 举报
回复
我的线程当然有对Swing组件的操作,难道这就可能引起Swing的随机崩溃吗?
xuwanhong 2002-09-16
  • 打赏
  • 举报
回复
另外CSDN好慢阿,我们换一个地方聊也行了,分照给,不够在加!
http://www.javaresearch.org/forum/thread.jsp?column=286&thread=2344
qxjavajava 2002-09-16
  • 打赏
  • 举报
回复
记住在你的线程中不能操作任何swing组件。
xuwanhong 2002-09-16
  • 打赏
  • 举报
回复
我现在不清楚Swing的多线程是否能够引起该问题,难理解,如果是它引起的那就好说了,但现在问题的病因为找到阿!另外我们在一边找资料一边测试
qxjavajava 2002-09-16
  • 打赏
  • 举报
回复
如果你看一看一些多线程讲的比较多的书,你就会发现,由于swing 不保证线程安全性,swing的大多数的方法是不能被同步的方法。
好在,已经游人提供了对于这种问题打解决方案。(我看的时《java专业变成指南》
hystream 2002-09-16
  • 打赏
  • 举报
回复
发现一次,不代表没有问题,既然有问题,肯定还会出现第2、3、4...次。
建议再测试一段时间,如果还有这个问题,那就要考虑考虑了。
xuwanhong 2002-09-16
  • 打赏
  • 举报
回复
呵呵,据我调查他们的源代码所执行的效果一样,我回答了我刚才的疑问,呵呵,是你们给了我智慧之源。
xuwanhong 2002-09-16
  • 打赏
  • 举报
回复
另外:在问一下,我准备用SwingUtilities或EventQueue来替换我原来的Swing线程,请给我一点建议。
xuwanhong 2002-09-16
  • 打赏
  • 举报
回复
楼上兄弟,非常感谢你的答复,我在没有怀疑其他地方的情况下,我也对这个无法控制的线程包一怀疑,我在不管问题是不是这个,我都要改调,不过我对Swing会引起Java崩溃,而且不抛任何异常的情况下退出,我非常纳闷,按道理来说,它应该抛java.lang.OutOfMemoryError或java.lang.ArrayIndexOutOfBoundsException异常啊
DanielYWoo 2002-09-16
  • 打赏
  • 举报
回复
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;
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧