Java线程:让EDT函数等待EDT的长时间运行功能

时间:2013-09-11 09:05:32

标签: java multithreading swing event-dispatch-thread

假设我有一个函数refresh(),它调用另外两个函数,一个是长期运行的clearData()函数,需要在EDT上运行,另一个是在EDT中运行的快速函数repaint()并重新绘制GUI组件。

refresh()
{
   clearData(); //off the EDT function
   repaint(); //in the EDT function
}

当需要运行像clearData()这样的较长操作时,处理重绘的正确方法是什么。 它是否让clearData线程在完成正确的方式后运行repaint()?怎么办呢?

2 个答案:

答案 0 :(得分:0)

是的,在repaint()完成后运行clearData()。你可以使用SwingUtilties.invokeLater()或类似的东西让repaint()在EDT上运行。

可能的实施

final Runnable CLEAR_THEN_REPAINT = new Runnable() {
    public void run() { 
        clearData(); 
        SwingUtilities.invokeLater(new Runnable() {
            public void run() { repaint(); }
        });
    }
};

void refresh() {
    if (SwingUtilities.isEventDispatchThread()) {
        new Thread(CLEAR_THEN_REPAINT).start();
    } else {
        CLEAR_THEN_REPAINT.run();
    }
}

答案 1 :(得分:0)

refresh() {
    new Runnable(){
        clearData();
        SwingUtilities.invokeLater(new Runnable() {
            repaint();
        });
    }.run();
}

请注意,重新注册将在clearData();返回后注册,因此,保证repaint()将在clearData()之后执行。