4

シリアルサーマルプリンターでチケットを印刷するGuiアプリケーションを使用しています。このアクションを起動するボタンを押すと、GUI がフリーズします。コードが EDT で実行されるためだと思います。確かにjstackを使用しましたが、以下の結果がわかりません:

Full thread dump Java HotSpot(TM) Client VM (23.3-b01 mixed mode, sharing):

"Thread-12" prio=6 tid=0x03012000 nid=0xd04 runnable [0x038ef000]
java.lang.Thread.State: RUNNABLE
    at gnu.io.RXTXPort.eventLoop(Native Method)
    at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)

"Thread-6" prio=6 tid=0x0302c400 nid=0x1b0 waiting on condition [0x039ef000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at posO2.Threads.ThreadHorloge.run(ThreadHorloge.java:46)

"Thread-5" prio=6 tid=0x03511c00 nid=0x9e4 waiting on condition [0x0399f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at posO2.Threads.ThreadIgor.run(ThreadIgor.java:29)

"Thread-7" prio=6 tid=0x034b9800 nid=0xb40 waiting on condition [0x0394f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at posO2.Threads.ThreadHorloge.run(ThreadHorloge.java:46)
    at java.lang.Thread.run(Unknown Source)

"Thread-4" prio=6 tid=0x0318ec00 nid=0xa08 waiting on condition [0x0323f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at posO2.Threads.ThreadMajProduits.run(ThreadMajProduits.java:49)

"TimerQueue" daemon prio=6 tid=0x03036400 nid=0x9b8 waiting on condition [0x0344
f000]
java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x27e76778> (a java.util.concurrent.locks.Abstra
ctQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
.await(Unknown Source)
    at java.util.concurrent.DelayQueue.take(Unknown Source)
    at javax.swing.TimerQueue.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

"DestroyJavaVM" prio=6 tid=0x003c8400 nid=0xfe4 waiting on condition [0x00000000
]
java.lang.Thread.State: RUNNABLE

"AWT-EventQueue-0" prio=6 tid=0x02b6e000 nid=0xcbc runnable [0x033fe000]
java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    - locked <0x22f33f30> (a java.io.BufferedInputStream)
    at java.io.DataInputStream.readByte(Unknown Source)
    at org.hsqldb.result.Result.newResult(Unknown Source)
    at org.hsqldb.ClientConnection.read(Unknown Source)
    at org.hsqldb.ClientConnection.execute(Unknown Source)
    - locked <0x22f32700> (a org.hsqldb.ClientConnection)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)
    - locked <0x22be23b0> (a org.hsqldb.jdbc.JDBCStatement)
    at posO2.Printer.flash(Printer.java:1058)
    at posO2.Printer.bigFlash(Printer.java:1111)
    at posO2.Panels.Accueil$5.actionPerformed(Accueil.java:314)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

"AWT-Shutdown" prio=6 tid=0x02b81800 nid=0xefc in Object.wait() [0x033af000]
java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x27c707c0> (a java.lang.Object)
    at java.lang.Object.wait(Object.java:503)
    at sun.awt.AWTAutoShutdown.run(Unknown Source)
    - locked <0x27c707c0> (a java.lang.Object)
    at java.lang.Thread.run(Unknown Source)

"AWT-Windows" daemon prio=6 tid=0x03002800 nid=0xe58 runnable [0x0328f000]
java.lang.Thread.State: RUNNABLE
    at sun.awt.windows.WToolkit.eventLoop(Native Method)
    at sun.awt.windows.WToolkit.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

 "Java2D Disposer" daemon prio=10 tid=0x03000400 nid=0x4d0 in Object.wait() [0x03
1ef000]
java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x27c2bf18> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    - locked <0x27c2bf18> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    at sun.java2d.Disposer.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

"Service Thread" daemon prio=6 tid=0x02b63000 nid=0xb94 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE

"C1 CompilerThread0" daemon prio=10 tid=0x02b54c00 nid=0x3f0 waiting on conditio
n [0x00000000]
java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x02b53400 nid=0x924 waiting on condition [
0x00000000]
java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x02b52000 nid=0xb88 runnable [0x00000000
]
java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x02b43c00 nid=0xfc8 in Object.wait() [0x02dff000]

java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x27c2c148> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    - locked <0x27c2c148> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

"Reference Handler" daemon prio=10 tid=0x02b3f000 nid=0x488 in Object.wait() [0x
02daf000]
java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x27c2bdd8> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:503)
    at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
    - locked <0x27c2bdd8> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x02b3d400 nid=0xa6c runnable

"VM Periodic Task Thread" prio=10 tid=0x02b76800 nid=0xf30 waiting on condition


JNI global references: 426

最初のスレッド「Thread-12」が原因で、GUI がフリーズしていることをどこで確認できるかを誰かに説明してもらえますか。

次に、このスレッドを 1 回しか実行していないと確信している限り、「Thread-6」と「Thread-7」の違いは何ですか。

4

3 に答える 3

6

AWT-EventQueue-0はイベント ディスパッチ スレッドであり、ソケットを介したシリアル ポートRXTXからの読み取りは実際にブロックされていますhsqldbSwingWorker@Kumar の提案に従って、 を使用する必要があります。例はここここにあります。このような例をプロファイラーで調べると、研究に役立つことがわかりました。

Thread-6inThread-7のインスタンスとしてアプリケーションに属しているように見えます。スレッド名について:Threads.ThreadHorlogeposO2

すべてのスレッドには、識別のための名前があります。複数のスレッドが同じ名前を持つ場合があります。スレッドの作成時に名前が指定されていない場合は、新しい名前が生成されます。

SwingWorker通常、およびExecutorsにはテキストpool-nが含まれていることに注意してください。ここで、nはシーケンス番号です。

補遺:私の EDT は RUNNABLE 状態にあるので、貼り付けたコードから、ブロックされていることがわかりますか? また、RXTX を介した読み取りがブロッキングの原因であることはどこでわかりますか?

すみません、私の間違いです; 上に訂正。EDT は、モニター ロックを待機するという意味でBLOCKEDはありません。Thread.STATEデータベースが応答するのを待っているという意味でブロックされています。少なくとも、-QUITシグナルを送信したときにコールスタックの上に表示されるのに十分な時間です。シリアル操作もネットワーク操作も、EDT でスケジュールする必要はありません。

于 2012-10-04T16:34:02.887 に答える
5

1つの非常に基本的なルール:

  • UIはUIスレッドで機能し続け、非UIは非UIスレッドで機能します。

このようにして、GUIをインタラクティブ応答性の高いものに保つことができます。

  • Java Event Dispatcher Thread(EDT)はUIスレッドでありmain()、Java GUIアプリケーションのメソッドは長続きしないため、Event Dispatcher QueueでGUI構築の作業をスケジュールした後、終了し、GUIを処理するのはEDTです。

  • Thread長い非UI処理作業を実行するために使用するか、またはを使用してSwingWorker、これはJavaで提供され、UIと非UI作業の間のシームレスな同期を実行します......

于 2012-10-04T13:49:09.460 に答える
3

このスレッドは、イベントキューから開始されたスレッドです。

"AWT-EventQueue-0" prio = 6 tid = 0x02b6e000 nid = 0xcbc runnable [0x033fe000] java.lang.Thread.State:RUNNABLE

このトレッドのスタックトレースの最後で、EventDispatchThreadによって開始されているためです。

java.awt.EventDispatchThread.run(不明なソース)で

「スレッド6とスレッド7の違いは何ですか」についてのあなたの質問に関しては、私はあなたに直接の答えはありませんが、これらのスレッドのほとんどはあなたのプロファイラーによって作成されたと思います(あなたが何であるかということです)見ることはそれがスピンアップしたスレッドです)。しかし、それは間違っている可能性があります。オフハンドで参照しているThreads.ThreadHorlogeクラスに何も見つかりません。

于 2012-10-04T13:53:15.837 に答える