我知道这是太多的多线程线程。我已经阅读了大量的内容。我已经阅读了基本的线程教程。但没有人回答我的问题,我有几个问题。
问题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的内容以获取内容。
对于冗长乏味的阅读感到抱歉。并感谢你还在这里。
我希望得到一些关于我的问题的澄清。
答案 0 :(得分:4)
“它在调用start方法时执行run方法吗?”
是
所有其他问题:你不应该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();