当前位置:  技术问答>java相关

一个非常不明白的Swing问题

    来源: 互联网  发布时间:2015-09-05

    本文导语:  我遇到一个很难发现的问题,我在Swing中用到了多线程的问题(但我认为Swing可以使用多线程,我现在也这样认为),问题是Swing偶尔会不知不觉得关闭,我不明白,而且不抛任何异常,另外这个机率太小,使用四台计...

我遇到一个很难发现的问题,我在Swing中用到了多线程的问题(但我认为Swing可以使用多线程,我现在也这样认为),问题是Swing偶尔会不知不觉得关闭,我不明白,而且不抛任何异常,另外这个机率太小,使用四台计算机进行测试两三天,只在一台计算机上发现一次,它的计算机配置是CPU4,请大家帮我出出主意,或如果有遇到该问题的同僚一起来来谈谈经过

|
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;
}

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

|
发现一次,不代表没有问题,既然有问题,肯定还会出现第2、3、4...次。
建议再测试一段时间,如果还有这个问题,那就要考虑考虑了。

    
 
 

您可能感兴趣的文章:

  • 一个问题,有点不明白!!!
  • 关于终端的一些小问题,不明白。。。
  • 关于一个没说明白的问题
  • 关于字体的问题?实在是看不明白sun的api文档!!!!!!!!!!!!
  • 搞不明白的问题??
  • 新手问题:一个编译错误信息,没有明白意思。
  • 新手 有一个不明白的问题,先谢谢大家
  • linux 分区 储存问题,纠结,想不明白了(新手)
  • 一个简单的问题,你一看就明白!
  • 页面号的问题,实在没有想明白。
  • 奇怪的问题?实在不明白为什么??
  • 呵呵,小不点有个小问题不明白,大家帮帮忙好吗?
  • socket编程中一个还没想明白的问题!希望得到高手的帮助!
  • 关于字符串的问题还是没搞明白!please help me!
  • 最简单的一个malloc问题,想不明白中
  • 一个想不明白的问题,为什么在windows中可以ping 通域名,但在linux却不可以 ??
  • 绝对菜鸟问题:这是什么用法啊,看不太明白
  • 有个问题一直想不明白,是关于类的,很简单的
  • 谁现在学thinkinjava了,留个qq,,,好多问题我自己弄不明白///
  • 有问题不明白,半天没弄明白,请求坛子兄弟帮忙。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 这几个是什么服务,不明白为什么一直开启?一直都没弄明白过
  • 请教大家!!!java如何实现多重继承?接口该如何使用?份数可以再加,只要我明白了
  • linux crontab 设定老是想不明白。。。。
  • 有句话不明白,求解释
  • Makefile中的一句不明白,关于shell中sed函数
  • 我在看一个GNU软件时发现有这么一句,不明白什么意思
  • 不明白seteuid()的作用
  • i=$(($i+1))。为什么i=$($i+1)就不行呢?不明白里面那层括号起什么作用。
  • 在init脚本中屡屡看到类似命令,不明白的说:mount -t sysfs /sys /sys
  • VMWare上装了个Fedora,但装不上VMWareTools,新手,不明白为什么
  • 总算明白gettext函数是怎么用的了!散分
  • 想了解LINUX一定能明白汇编语言吗?
  • 请问:什么是组合?看了THINGKING IN JAVA后,还是不是很明白
  • 我不是很明白,请帮忙!
  • method overriding 的意思我明白,但在中文里应该翻译成什么为好?
  • 灌水贴子,有什么不明白到www.52jsp.com论坛看看
  • 小弟一直弄不明白this这个关键字。
  • 不明白!
  • 有点不明白
  • 急于明白Fork的用法.请提供中文解释.谢谢.


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3