Java多线程不明确

时间:2011-03-04 08:58:44

标签: java multithreading jtable

我知道这是太多的多线程线程。我已经阅读了大量的内容。我已经阅读了基本的线程教程。但没有人回答我的问题,我有几个问题。

问题1:

创建实现Runnable接口的类时,我必须实现Run()方法。

如果我创建一个新的线程,如:

Thread t1 = new Thread();

在调用start方法时执行run方法吗?

现在我希望我的Thread t1在一个线程中执行另一个方法。

我面临以下情况:

    tblGames = new JTable(new GamesTableModel(mainController.retrieveGames()));

我认为这是令人讨厌的编码。 我认为最好像这样实例化一个列表变量:

List<Game> games = mainController.retrieveGames();

现在发生的是,加载表格内容时GUI冻结(使用JPA) 所以我想在另一个线程中运行它。我使用GamesTableModel来处理JTable的列等,因此我在新的GamesTableModel的构造函数中传递一个List

在哪里创建新线程,我是否将它创建为MainController类,如果是,

(关于方法如下:)

    public List<Game> retrieveGames(){
    List<Game> games = gameRepository.getGames();

    return games;
}

我将如何在不同的线程中运行该方法的内容或整个方法,实际上,将整个MainController放在一个新线程中是很好的,这样它就永远不会冻结UI,或者这是不可取的?

如果可取,我是否需要在UI中创建一个线程?谁然后导致问题,我将如何运行

MainController mainController = new MainController();

在新帖子中?

我以前从未在程序中正确实现线程,因此我的新问题。

我主要关心的是界面中的run方法,内容是否适用于实现类权限中的所有线程?

我需要单独的线程来执行几种不同的方法。

现在的主要问题是使用新线程来填充JTable的内容以获取内容。

对于冗长乏味的阅读感到抱歉。并感谢你还在这里。

我希望得到一些关于我的问题的澄清。

3 个答案:

答案 0 :(得分:4)

  1. “它在调用start方法时执行run方法吗?”

  2. 所有其他问题:你不应该access Swing components outside of Even Dispatching Thread(EDT)。这就是你得到冻结的原因。从后台线程访问Swing时应该使用SwingWorker

答案 1 :(得分:2)

  

问题1:

     

创建实现的类时   Runnable接口,我必须   实现Run()方法。

     

如果我创建一个新的线程,如:

     

线程t1 =新线程();它执行   调用start时的run方法   方法对吗?

是的,这是正确的。 Runnable接口要求您实现run()方法,该方法在线程上执行start()时自动执行。

  

我面临以下情况:

tblGames = new JTable(new GamesTableModel(mainController.retrieveGames()));
     

我认为这是令人讨厌的编码。我认为   最好实例化一个   像这样列出变量:

这不一定是讨厌的编码。如果您的意图是,请引用: I am using a GamesTableModel to handle the columns etc for the JTable, hence I pass a List in the constructer of new GamesTableModel 那么这也是完全可以接受的,唯一的含义就是代码的可读性。

  

我在哪里创建新主题   创建MainController类,   如果是这样,   如果不知道你的MainController类实际上在做什么,这很难说,但从它的声音来看,我可能会猜错。

     

我将如何运行   该方法的内容,或整个   在不同的线程中的方法,   实际上,拥有它会很好   整个MainController在一个新线程中,   这样它就永远不会冻结UI,   或者这是不可取的?

您可以定义一个实现Runnable的新类,并在需要时实例化该类的对象。接下来,在该类的构造函数中,您可以在新实例上调用start。但是,在swing编程中,您可以将SwingWorker线程用于资源密集型任务。如果你在EventDispatch线程中混合使用这个资源密集型逻辑,那么UI肯定会冻结,我怀疑这是你的问题。

  

如果可取,我是否需要创建一个   用户界面中的线程?谁然后导致   问题,我将如何运行

     

MainController mainController = new   MainController();在一个新的线程?

您需要在SwingWorker线程中执行此操作。以下是如何使用swing编程Source执行此操作的示例。下载并运行IconDemo项目。

  

我对run方法的主要关注   从界面来看,内容   适用于中的所有线程   实施阶级权利?

作为该类实例的线程将具有相同的运行方法逻辑。但是,可以使用不同的run方法创建另一个类的新线程。

总之,我强烈建议您了解SwingWorkers在swing编程中的概念。我觉得这个概念可以帮助你解决你遇到的一些问题。

答案 2 :(得分:1)

首先,在构造函数上运行持久的数字运算通常是一个坏主意。所以,我首先将运算分解为不同的方法,如下所示:

// Initialize
MainController mainController = new MainController();
// Do the work
mainController.doStuff();

然后你可以在线程中运行该部分:

class MyThread extends Thread {
    MainController mainController;

    MyThread(MainController mainController) {
        this.mainController = mainController;
    }

    public void run() {
        mainController.doStuff();
    }
}

现在你可以在其他地方打电话:

MainController mainController = new MainController();
MyThread myThread = new MyThread(mainController);
myThread.start();