我应该把工作线程放在哪里

where should I put the worker thread

我在此处阅读了有关 Swing 并发的信息 Concurrency in Swing,但我不明白在我的项目中的何处执行我的工作线程 我有一个面板,它绘制它 component ,如果单击某些东西,它会从另一个对象调用一个方法。面板 class 似乎是这样的。单击鼠标后,我们调用棋盘方法 callAI();

public class BoardPanel extend JPanel implements MouseListener , MouseMotionListener 
{
    private Board myBoard;

    public BoardPanel()
    {
        //////////// Some code here
    }

    public void paintComponent(Graphics g)
    {
        ///Some code here
    }

    public void mouseClicked(MouseEvent event)
    {
        ///Some changes in the panel components. 
        repaint();
        myBoard.callAI();
    }
}

板class实现如下。 callAI()方法,调用classAIPlayer对象播放器的startThinking()方法。这是消耗 CPU 并在方法 startThinking() 完成后使面板冻结并重新绘制的方法。

public class Board
{
    private AIPlayer player;

    public Board()
    {
        //some code here.
    }

    public void callAI()
    {   
        player.startThinking();
    }

}

据我了解,我需要使用辅助线程。但是我不明白我应该在哪个 class 中使用它。我认为它与 Swing 组件有关,所以我需要在 BoardPanel class 中使用它,但我无法扩展 SwingWorker class 因为我已经扩展了 JPanel。我应该在 BoardPanel class 中使用任何匿名 class 吗? 所以我的问题是,我应该在哪里扩展 SwingWorker class 并使用 doInBackground() 方法以及为什么。

您可以在 startThinking 方法中使用匿名 SwingWorker

    startThinking() {     
        new SwingWorker<Void, Void>() {
                @Override
                public Void doInBackground() {
                    // do your work here

                    return null;
                }
        }.execute();
    }

您想在另一个线程中的 Swing 应用程序中执行任何繁重的工作。您甚至可以将另一个扩展 SwingWorker 的 class 用于调用,并在 startThinking 方法内部执行。 希望这能引导您朝着正确的方向前进!