程序运行速度很慢,忽略Thread.sleep

时间:2016-05-20 10:38:44

标签: java multithreading user-interface

我写了一个复杂的java程序,它有一个GUI。

在GUI中我有三个按钮,"播放","播放全部"和"重置",以及一些表格。

当我点击播放时,程序会执行其逻辑,然后将输出打印到我提到的表格中。这是正常的,正如预期的那样。经过一定数量的游戏"操作,我们将所有数据打印到表中,所以我们完成了,不能再点击它了。在这一点上,我禁用播放按钮。

当我点击全部播放时,我希望它好像我点击了#34;播放"直到它不再可能。所以我写了这段代码:

public synchronized void actionPerformed(ActionEvent event) 
{
    if(event.getSource() == playAllButton)
    {
        while(playButton.isEnabled())
        {
            playButton.doClick();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    if(event.getSource() == playButton)
    {
        Command command = listOfCommands.get(commandNumber++);
        if(command.getCommandType() == "PF")
        {
            PFLabel.setText("PF Count:" + (++PFCount));
        }
        if(command.getCommandType() == "PR")
        {
            PRLabel.setText("PR Count:" + (++PRCount));
        }
        if(command.getCommandType() == "GP")
        {
            if(checkIfPF())
            {
                addPageToRam(((GPCommand)command).getPage());
            }
            else
            {
                if(checkIfPR(((GPCommand)command).getPage().getPageId()))
                {
                    replacePage(((GPCommand)command).getPage(),getWithWhoToReplace(((GPCommand)command).getPage().getPageId()));
                }
            }
        }
    }
    if(commandNumber == listOfCommands.size()) // we are done!
    {
        playButton.setEnabled(false);
    }
}

正如我所提到的,当我点击播放按钮时,它会立即按预期打印结果。 但是当我单击全部播放时,它会运行很长时间而不显示任何输出,然后在最后打印最终结果。这不是我想要的。我想要的是它打印当前结果,稍等一下,我可以查看它,然后打印下一个结果。

即使我删除Thread.sleep它也很慢(并且仍然只打印最后一个结果)。

有没有办法让它跑得更快?更重要的是 - 在再次点击按钮之前如何让它等待?我想在再次点击之前查看当前结果一段时间。

1 个答案:

答案 0 :(得分:1)

在评论部分我发现,可以通过使用SwingWorkers并将长时间执行的代码移动到异步任务来解决问题。 Coobird先生发布了一种方法,如何做到here