2011-03-04 103 views
0

我知道这是如此manieth多线程线程。我已经阅读了其中的很多。我已经阅读了基本的线程教程。但没有人回答我的问题,我有几个问题。Java多线程unclarity

问题1:

当创建一个实现Runnable接口的类,我必须实现的run()方法。

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

Thread t1 = new Thread(); 

它执行时调用start方法正确运行的方法?

现在我想让我的线程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中创建一个线程?然后导致这个问题,我将如何运行

MainController mainController = new MainController(); 

在一个新的线程?

我从来没有在程序中正确实现线程,因此我的newb问题。

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

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

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

对不起长时间乏味的阅读。并感谢你仍然在这里。

我希望收到一些关于我的问题的说明。

+0

'SwingWorker'可以帮助您解决所有问题。阅读一些教程,这很简单。 – 2011-03-04 09:03:54

+0

同意鲍里斯在SwingWorker上。之后,在实践中给自己一份Java并发:http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/ref=sr_1_1?ie=UTF8&s=books&qid=1283782299&sr=8- 1 – 2011-03-04 09:05:42

+0

感谢你们俩。 :)我现在读关于它:) – 2011-03-04 09:47:18

回答

2

问题1:

当创建一个实现一类的Runnable接口,我不得不 执行Run()方法。

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

线T1 =新的Thread();它在调用启动 方法时执行 运行方法是否正确?

是的,这是正确的。 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, 使之能永远不要冻结用户界面, 或者这是不可取的?

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

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

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

您需要在SwingWorker线程中执行此操作。这里是一个例子,说明如何用swing编程Source来做到这一点。下载并运行IconDemo项目。

我从接口的run方法 主要关注的是,内容 适用于 实现类权利的所有主题?

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

总之,我强烈建议你理解摆动编程中SwingWorkers的概念。我有一种感觉,这个概念将帮助你解决你遇到的一些问题。

+0

非常感谢您花时间阅读这些问题。我非常感谢你的回答。你把我的问题名称合理化,事情变得清晰起来。我不认为我可以要求更好的答案。谢谢。我现在要去挖掘更多的信息并下载Icon演示。如果没有其他事情出现匹配这个至少,我会将这个线程标记为您的帖子回答。 – 2011-03-04 09:25:23

+0

@Joey不客气。切记要仔细研究我仔细提供的源代码 - 我通过自己理解该示例开始了摆动编程。请注意,该示例中的资源密集型图像加载由SwingWorker处理。 – 2011-03-04 09:36:04

+0

谢谢。我现在正在看它。这是非常有趣的代码。只需一步一步阅读,直到我完全理解它。线程并不是我发现的最简单的主题。 :P但是再次感谢。你的答案是一个很好的答案。 – 2011-03-04 09:43:14

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(); 
+0

我不太清楚我是否理解这一切。在这种情况下,我将如何在新线程中运行以下内容?列表 games = mainController.doStuff();我的MainController对象在UI始终处于活动状态时需要保持活动状态。我想,每当我需要一个控制器动作来执行时,不断重新创建对象是令人讨厌的。另外,我将如何去run()? mainController中会有10个方法,我认为需要执行的方法不可行。 – 2011-03-04 09:21:53

+0

如果mainController需要在整个生命周期中保持活动状态,那么在它的构造函数中运行繁重的操作更糟糕的主意。 问题是如何在一个单独的线程中运行某些东西;如何设计一个运行繁重处理的整个程序超出了这个范围。关于线程,您的主要选项是为每种类型的处理创建一个新的线程子类,或创建一个所有可处理项实现的接口,然后让一个Thread子类将接口作为参数并通过它调用处理代码。 – Zds 2011-03-07 10:36:46