界面使用单实例模式 画一个界面。然后其它类给它上面的组件赋值,每次访问单实例模式只要涉及到 
Singleton.getInstance().xxx    操作的时候程序就停滞,不是停止,
也不知道为什么。也不饱错误或者异常?大家给个意见阿?用了好多方法,也问了朋友,没搞定呢。

解决方案 »

  1.   

    Singleton.getInstance().xxx 

    把你的单例实现方式贴一下,如果自己访问应该不是死锁,你单例设计的有问题吧。
      

  2.   

    看你描述的,分析一下,原因可能有二:
    一、你使用的是懒汉式单例模式。每次初次访问因为要进行一些实例变量的初始化所以停滞一下。
    二、问题不是在单例模式上边。比如,i/o 操作,http 链接等等。
      

  3.   

    Singleton.getInstance()里面干吗了?你的单例有问题。
      

  4.   

    package pic;import java.util.TimerTask;import org.eclipse.swt.*;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.widgets.*;public class SingletonGUI { private static final SingletonGUI instance = new SingletonGUI(); public static SingletonGUI getInstance() {
    return instance;
    } private TimerTask task = new DistributeFile();
    private DoDistribute pt = new DoDistribute(task); public Text txtSFileSum; /**
     * @wbp.parser.entryPoint
     */
    private SingletonGUI() {
    final Display display = Display.getDefault();
    final Shell shlG = new Shell(display, SWT.MIN | SWT.CLOSE);
    shlG.setSize(500, 210);
    shlG.setText("Show Information"); final Group groups = new Group(shlG, SWT.NONE);
    groups.setText("Input");
    groups.setBounds(40, 20, 420, 72); Label label_1 = new Label(groups, SWT.NONE);
    label_1.setBounds(66, 37, 54, 12);
    label_1.setText("sum"); txtSFileSum = new Text(groups, SWT.BORDER);
    txtSFileSum.setEditable(false);
    txtSFileSum.setBounds(126, 32, 157, 18);
    txtSFileSum.setText(""); Button btnStart = new Button(shlG, SWT.NONE);
    btnStart.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
    System.exit(0);
    }
    });
    btnStart.setToolTipText("");
    btnStart.setBounds(116, 125, 72, 22);
    btnStart.setText("start");
    // 定时器事件
    pt.start(1, 6); shlG.open();
    shlG.layout();
    while (!shlG.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    }
    } public static void main(String[] args) throws Exception {
    // new SingletonGUITest();
    }
    }package pic;import java.util.TimerTask;import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Text;public class DistributeFile extends TimerTask {
    public DistributeFile() {
    } public void run() {
    //这只是测试代码,每次走过 Come in ,就停住了,不知道为什么。 
    System.out.println("come in"); SingletonGUI.getInstance().txtSFileSum.setText("hello");//这个位置有问题? System.out.println("out");
    }
    }package pic;import java.util.TimerTask;
    import java.util.Timer;public class DoDistribute {
    private Timer timer;
    private TimerTask task; public DoDistribute(TimerTask task) {
    this.timer = new Timer();
    this.task = task;
    } public void start(int delay, int internal) {
    timer.schedule(task, delay * 1000, internal * 1000);
    }
    }大家帮忙看看,怎么处理啊。
      

  5.   


    private static final SingletonGUI instance = new SingletonGUI(); public static SingletonGUI getInstance() { 
    return instance; 
    } 我觉得可以考虑把这一块改改
    private static final SingletonGUI instance =null;public static synchronized SingletonGUI getInstance() { 
    if(null==instance){
    instance=new SingletonGUI();
    }else{
    return instance; 
    }

      

  6.   

    因为单实例模式对象构造函数,死循环造成死锁。目前解决。
    private Display display;
    private Shell shlG; private SingletonGUI() {
    画面部分代码 略
    } private void run() { // 启动定时器事件
    pt.start(1, 6);
    shlG.open();
    shlG.layout();
    while (!shlG.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    }
    }
    public static void main(String[] args) throws Exception {
    SingletonGUI sg = SingletonGUI.getInstance();
    sg.run();
    }