3

长话短说; 我编写了一个包含无限循环的程序,其中一个函数连续运行,并且必须尽可能快地运行。

然而,虽然这个函数在微秒时间尺度内完成,但我需要生成另一个线程,这将花费相当长的时间来运行,但它不能影响前一个线程。

希望这个例子能帮助解释事情:

while (updateGUI == true) { //So, forever until terminated

        final String tableContents = parser.readTable(location, header);
        if (tableContents.length() == 0) {//No table there, nothing to do
        } else {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                    //updateTable updates a JTable 
                    updateTable(tableContents, TableModel);
                    TableColumnModel tcm = guiTable.getColumnModel();
                }
            });
        }
     ***New thread is needed here!
    }

所以我需要让readTable函数运行无限次,但是我需要启动第二个线程,该线程也将运行无限次,但是它需要毫秒/秒才能完成,因为它必须执行一些文件 I/O,可能需要一些时间才能完成。

我玩过扩展Thread类,并使用它Executors.newCacheThreadPool来尝试产生一个新线程。但是,我所做的任何事情都会导致readTable函数变慢,并导致表无法正确更新,因为它无法足够快地读取数据。

我可能需要重新设计这个循环的运行方式,或者可能只是启动两个新线程并将无限循环放在其中。

以这种方式设计它的原因是,一旦updateTable函数运行,它会返回一个用于更新 a 的字符串JTable,这(据我所知)必须在 Java 的 Main Dispatch Thread 上完成,因为是创建 GUI 表的位置。

如果有人有任何建议,我将不胜感激。

谢谢

4

4 回答 4

3

当您更新 aJTable时,SwingWorker会很方便。在这种情况下,一个工作人员可以与另一个工作人员共存,如此处所建议

于 2013-10-30T10:31:06.050 回答
3

您必须非常小心,以免机器超载。您需要使长时间运行的任务独立于必须快速的线程。您还需要限制一次运行的数量。我会先设置一个上限。

另外你的屏幕只能更新这么快,你只能看到屏幕更新这么快。首先,我会将每秒更新次数限制为 20 次。

顺便说一句,设置优先级仅在您的机器过载时才有帮助。您的目标应该是首先确保它不会超载,然后优先级就无关紧要了。

于 2013-10-30T10:36:39.763 回答
2

很难猜出这里发生了什么,但是您说“表中的结果没有正确更新,因为它无法足够快地读取数据”。如果你的意思是代码的正确性受到时间不够快的影响,那么你的代码不是线程安全的,你需要使用适当的同步。

正确性不能依赖于时间,因为线程执行的时间在标准 JVM 上是不确定的。

另外,不要摆弄线程优先级。除非你是一个并发专家试图做一些非常不寻常的事情,否则你不需要这样做,它可能会使事情变得混乱和/或中断。

于 2013-10-30T10:29:17.980 回答
0

因此,如果您希望您的“无限”循环线程具有最大优先级,为什么要将 EDT 的优先级设置为 MAX,以便为您设置“最宝贵的”?

               Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                //updateTable updates a JTable 
                updateTable(tableContents, TableModel);
                TableColumnModel tcm = guiTable.getColumnModel();

在这段代码中,当前线程将与 EDT 或 EDT 产生一个。为什么不在循环之前移动那条线while

于 2013-10-30T10:28:57.477 回答