java错误:mainthread等待直到执行第二个线程

时间:2014-05-20 11:50:04

标签: java multithreading

我已经制作了自己的状态栏。使用statusbareditor,我可以在栏上设置一些消息,并在10秒后消失。因为我的GUI可能没有被阻止,所以这个statusbareditor在第二个线程上工作。这很好用。但在编辑状态栏后,我在表单上设置了一个新面板。这个新面板仅在10秒后出现。这很奇怪,因为statusbareditor在不同的线程上工作。

public void HandleLoggedIn(Person account) {
    StatusbarEditor reportThread = new StatusbarEditor(labelStatusbar, "Aangemeld als " 
            + account.toString() + ".");
    reportThread.start();
    asideform = new Asideform();
    asideform.AddFollower(this);
    this.add(asideform, BorderLayout.WEST);
}

和statusbareditor-class:

public class StatusbarEditor extends Thread{

    private JLabel statusbar;
    private String text;

    public StatusbarEditor(JLabel statusbarlabel, String report){
        statusbar = statusbarlabel;
        text = report;
    }

    @Override
    public void run() {
        statusbar.setText(text);
        try { 
            Thread.sleep(10000);
        }  catch (InterruptedException ex) {
            Logger.getLogger(StatusbarEditor.class.getName()).log(Level.SEVERE, null, ex);
        }
        if(statusbar.getText().equals(text)){
            statusbar.setText("");
        }
    }
}

谢谢!

2 个答案:

答案 0 :(得分:0)

我只能想象那里出了什么问题:

asideform = new Asideform();
asideform.AddFollower(this);
this.add(asideform, BorderLayout.WEST);

此部件是否更新了您的UI?如果是,您必须考虑到您的线程很可能无法满足您的需求。只要没有其他定义,处理时间就近似随机分配。

修改

还有一件事:

 private JLabel statusbar;

这不属于您的UI类吗?

答案 1 :(得分:0)

没有看到“AsideForm”类很难说,但我的猜测是这是一个竞争条件。 也许您需要在启动线程之前准备您的asideForm对象,以便事件按预期顺序进行。