2012-10-04 2 views
4

스윙에서 GUI 열 응용 프로그램을 사용하여 직렬 열전 사 프린터에서 티켓을 인쇄합니다. 이 작업을 실행하는 버튼을 누르면 내 GUI가 고정됩니다. 제 생각에는 코드가 EDT에서 실행되기 때문입니다. 나는 확실하게 jstack을 사용하지만 난 아래의 결과를 이해하지 않는다 : 난 내 GUI 때문에 첫 번째 스레드 "스레드-12"의 냉동 것을 볼 수있는Java 스윙 : GUI 고정 - 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-6"과 "Thread-7"의 차이점은이 스레드를 한 번만 실행 한 것입니다.

+0

인쇄 호출이 차단 되었습니까? 그것이 블로킹 콜이라면, 그것을 다른 스레드에 위임하십시오. – Shark

답변

6

AWT-EventQueue-0는 이벤트 발송 쓰레드이며, 그것은 참으로 hsqldb를 통해 RXTX 소켓을 통해 시리얼 포트에서 읽기 차단됩니다. @Kumar에서 제안한대로 SwingWorker을 사용해야합니다. 예는 herehere입니다. 연구를 위해 profiler에서 그러한 사례를 조사하는 것이 도움이된다는 것을 알았습니다.

Thread-6Thread-7은 응용 프로그램에 Threads.ThreadHorloge의 인스턴스로 posO2에 속하는 것으로 보입니다. 스레드 이름 :

모든 thread에는 식별을위한 이름이 있습니다. 두 개 이상의 스레드가 같은 이름을 가질 수 있습니다. 스레드가 생성 될 때 이름이 지정되지 않으면 새로운 이름이 생성됩니다. SwingWorkerExecutors 전형적 N은 시퀀스 번호 텍스트 -N을 포함하는 것이

참고.

부록 : 내 EDT가하는RUNNABLE상태에 그래서 당신이 차단 된 것 알아낼 않는 내가 붙여 코드에서; RXTX를 통한 판독이 차단 원인 인 이유는 어디입니까??

미안하지만, 저의 실수입니다. 위의 수정. EDT는 Thread.STATE에서 모니터 잠금을 기다리는 의미에서 BLOCKED이 아닙니다. 당신이 -QUIT 시그널을 보낼 때 호출 스택의 꼭대기에서 볼 수있을만큼 충분히 긴 시간 동안 데이터베이스가 응답하기를 기다리고 있다는 의미에서 차단됩니다. EDT에서 직렬 작업이나 네트워크 작업을 예약하지 않아야합니다.

+0

감사합니다.하지만 제 EDT가 실행 가능한 상태에 있다고 말합니다. 코드에서 붙여 넣은 코드에서 차단되어 있다는 것을 알 수 있습니까? RXTX를 통해 읽는 것이 차단 원인입니까? – caRameL

5

한 아주 기본적인 규칙 :

  • 는 UI 스레드에서 UI 작업을 계속하고, 비 UI 스레드에서 비 UI 작동합니다.

이 방법으로 우리는 GUI 대화반응을 유지할 수 있습니다. 자바 이벤트 디스패처 스레드 (EDT)가 대기열이벤트 디스패처에 GUI 건설의 작업을 예약 한 후이 종료 너무 오래 살았되지 UI 스레드, 자바 GUI 응용 프로그램에서 main() 방법에

  • GUI를 처리하는 것은 EDT입니다.

  • 어느 긴 비 UI 처리 작업을 할 Thread 사용하거나 SwingWorker를 사용하는 것은, 이는 ...... 인터페이스 및 비 UI 작업 간의 원활한 동기화를 할 수있는 자바 제공

3

이 스레드는 이벤트 큐

"AWT-EventQueue의-0"프리 오 = 6 TID = 0x02b6e000 NID = 0xcbc 실행 가능한 [0x033fe000]에서 시작하는 java.lang.Thread.State되는 사람이다 RUNNABLE

당신은이 때문에 트레드의 스택 추적의 맨 끝에, 그것이 EventDispatchThread로 시작이야 말할 수

: java.awt.EventDispatchThread.run에서

(알 수없는 소스)

"Thread 6과 Thread 7의 차이점은 무엇입니까?"에 대한 질문까지는 직접 대답이 없지만 대부분이 스레드가 프로파일 작성자에 의해 작성되었다고 생각하고 있습니다. 다시 보았을 때 스레드라고합니다). 그것은 잘못 될 수 있습니다. 나는 Threads.ThreadHorloge 클래스에서 아무것도 찾을 수 없다.

+0

+1 이름이'Thread'에서 기본적으로 생성 된 것 같아요. – trashgod