代码之家  ›  专栏  ›  技术社区  ›  Stefanos Kargas

Java-具有JTHT和模型的奇怪问题(可能是线程问题)

  •  3
  • Stefanos Kargas  · 技术社区  · 16 年前

    我将使用2个表(jtable)及其默认表模型。 第一个表已经填充。 第二个表是为第一个表的每一行填充的(使用SQL查询)。 我的目的是导出第一个表的每一行,以及Excel文件中第二行的各行。

    我使用for(对于第一个表的每一行),其中我在excel文件中写入第一个表的一行,然后填充第二个表(对于第一个表的这一行),从表中获取每一行(实际上是从它的模型中获取的),并将其放入excel文件中第一个表的当前行下。 这意味着,如果第一个表中有n行,我将清除第二个表并再次填充n次。

    所有这些代码都在单独的线程中调用。

    问题是: 一切都很好,我有一些例外。 奇怪的是,我没有得到任何错误的结果。 Excel文件是完美的。

    一些例外情况包括:

    线程“awt-eventqueue-0”中出现异常java.lang.arrayindexoutofboundsException:0>=0 在Java.UTI.Vector .ELMENATAT(vector .java:427) 在javax .Swing .table中。Debug Tababl MuleDe.GETValueDebug(Debug TababMeldel.java:632) 在JavaX.Swing .jCopy.Frice(JBase.java:1017) 在JavaX.Swing .RePrimtMask.Pr绘画(RePrimtMault.java:1220) 在javax .Swing。RePrimtMault.PrimtDrimeStices(RePrimtMealg.java:803)

    我假设问题在于第二个表需要更多的时间来填充,然后再尝试从中获取任何数据。这就是为什么我在我的例外中看到了Repaintmanager和paintdirtyregions。 我做的另一件事是,我以调试模式运行我的程序,并在第二个表的每个填充之后放置一个断点。然后我按了F5键,继续第二张桌子上的每一个人,没有出现例外。这个节目毫无例外地结束了。 这是另一个重要的事实,告诉我在这种情况下,我可能给了表足够的时间来填充。

    当然,你会问我:

    • 如果你的程序运行良好,为什么你关心异常? 我关心避免任何未来的问题,我关心的是更好地理解Java和Java GUI和线程。

    • 为什么您依赖一个GUI组件(以及它的模型)来获取您的信息,为什么不使用SQL查询重新创建结果集来填充表,并从结果集获取信息? 那将是最好和正确的方法。事实上,我已经准备好了表代码,从中获取信息对我来说更容易。但正确的方法是直接从数据库中获取所有信息。不管怎么说,我提出的问题,回答它会帮助我了解更多关于Java的事情。所以我张贴了它。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Joel Hoff    16 年前

    Swing API不是线程安全的,除了一些方法调用: 重漆 , 再验证 使无效 . 所有其他调用,除非对特定类另有说明 必须 在事件调度线程上进行。

    从生成的后台/工作线程传输此类调用处理可以通过 swingutilities.Invokelater()。 swingutilities.invokeAndWait()。 .

    还有一些关于jtable和任何已附加到jtable实例的TableModel的具体讨论。 javax.swing package summary javadocs . 两者都不是线程安全的,因此必须在事件调度线程上执行从中访问数据的任何调用。

    这是您遇到异常的最可能原因,在调试程序中运行时遇到的不同行为是一个典型的竞争条件标志。也没有可靠的方法可以通过引入您自己的锁等来绕过这个问题。从长远来看,这种做法总是会导致麻烦(例如,在Swing库内部的事件调度队列锁的死锁),因为Swing实际上并没有被设计成线程安全的。

        2
  •  1
  •   kasperjj    16 年前

    发生异常是因为其中一个表模型为getValueAt(int row,int column)调用返回空值。原因可能是Swing或数据模型中的内部问题,因为您正在使用辅助线程访问数据模型。Swing API特别声明不能按照您描述的方式使用辅助线程。

    下面的文章提供了关于Swing中的单线程规则的进一步详细信息。

    http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html