Java中的并发 - 等待执行完成

时间:2014-08-25 15:20:29

标签: java multithreading concurrency

因此,我目前正在使用Java中的多线程进行一些工作,而且我很可能只是简单易用。

我目前有一个JButton,当按下时调用方法如下:

private void clickTest() throws InterruptedException{
    statOrganizer.incrementHappiness();
    Thread t = new Thread(new Happiness(workspaceHappy));
    t.start();
}

然后需要大约10-30秒才能完成。但是,在这段时间内,仍然可以重新单击JButton,以便它与信息的显示方式混淆。

我想要做的是在这个特定线程处于" alive"期间,禁用该按钮以便不再可以点击它(从而一旦它被激活就激活该线程)已经去了)。线程完成后,我想再次重新启用该按钮。

按钮代码看起来像这样

button.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent evt) {
                if (evt.getClickCount() == 1) {
                        try {
                            clickTest();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                }
            }
        });

3 个答案:

答案 0 :(得分:2)

在启动线程之前禁用该按钮。在线程中,最后发布一个重新启用按钮的事件(使用invokeLater)。

您可能还需要取消选项,但这是一个单独的问题。

答案 1 :(得分:0)

这个很好的解决方案是使用glass pane捕获所有事件并阻止它们传播到玻璃窗格下面板上的任何UI元素。当然,虽然您只有一两个,但您可以手动调用setEnabled(false),但玻璃窗格可以提供更大的灵活性,您永远不必担心向UI添加新元素而忘记禁用它在后台处理过程中。

虽然可能是一个按钮太过分了。

您应该考虑的另一个不相关的事情是使用Executors而不是为后台任务启动线程。它可以生成更清晰,更具伸缩性的代码。

答案 2 :(得分:0)

尝试以下方法:

button.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) {
            if (evt.getClickCount() == 1) {
                    try {
                        clickTest();
                        button.setEnabled(false);//this assume 'button' is final
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
        }
    });

然后,修改run类的Happiness方法:

public void run()
{

 //your processing code here
 ...

 button.setEnabled(true);
 //reference to button can be passed in constructor of Happiness
 // or access using getter, ... This really depend on your implementation.

}