# Deadlock? (main thread keeps waiting)

**URL:** <https://discourse.processing.org/t/deadlock-main-thread-keeps-waiting/8371>\
**Category:** Libraries\
**Created:** [February 13, 2019, 7:17pm UTC](https://discourse.processing.org/t/deadlock-main-thread-keeps-waiting/8371 "2019-02-13T19:17:43Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![maxhawaii](https://avatars.discourse-cdn.com/v4/letter/m/a9a28c/32.png) [@maxhawaii](https://discourse.processing.org/u/maxhawaii)\
**Post date:** [February 13, 2019, 7:17pm UTC](https://discourse.processing.org/t/deadlock-main-thread-keeps-waiting/8371/1 "2019-02-13T19:17:43Z")

</div>

Hi everyone,

I’m pretty sure that my processing sketch deadlocks and I’m having trouble debugging it.

Most of the time, the sketch runs fine but once in a while - sometimes after 10 minutes, sometimes after 6 hours of runtime - the sketch comes to a halt and stops rendering. Seems like a classic deadlock.

Using the VisualVM debugger I’ve been able to debug the supposedly deadlocked program. I can see that most threads are in a waiting state, including (what I’m guessing to be) the main rendering thread **main-FPSAWTAnimator#00-Timer0-FPSAWTAnimator#00-Timer1** which is waiting on a java.util.TaskQueue:

```auto
"main-FPSAWTAnimator#00-Timer0-FPSAWTAnimator#00-Timer1" Id=23 WAITING on java.util.TaskQueue@36fa2b88
	at java.lang.Object.wait(Native Method)
	- waiting on java.util.TaskQueue@36fa2b88
	at java.lang.Object.wait(Object.java:502)
	at java.util.TimerThread.mainLoop(Timer.java:526)
	at java.util.TimerThread.run(Timer.java:505)

```

I’m using the processing video library (processing.video) as well as the Client class from [processing.net](http://processing.net) package.

The movieEvent() and the clientEvent() methods of my sketch are being called regularly, even when the sketch seems to be deadlocked, and I am able to detect the deadlock from there (by checking how long it’s been since the last draw() was called).

I am also able to print a thread dump to my log file from either of those methods. I’ve been logging those thread dumps for a while and they always looks something like this:

```auto
"Thread-151270" Id=151815 RUNNABLE
	at sun.management.ThreadImpl.dumpThreads0(Native Method)
	at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:454)
	at LANDSCAPE$DebugUtilities.getThreadDump(LANDSCAPE.java:1909)
	at LANDSCAPE.movieEvent(LANDSCAPE.java:458)
	at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at processing.video.Movie.fireMovieEvent(Unknown Source)
	...

"gstreamer service thread 1" Id=66 WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@73f8bb93
	at sun.misc.Unsafe.park(Native Method)
	- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@73f8bb93
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	...

"Thread-6" Id=25 RUNNABLE (in native)
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
	at java.net.SocketInputStream.read(SocketInputStream.java:171)
	at java.net.SocketInputStream.read(SocketInputStream.java:141)
	at processing.net.Client.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:748)

"main-FPSAWTAnimator#00-Timer0-FPSAWTAnimator#00-Timer1" Id=23 WAITING on java.util.TaskQueue@36fa2b88
	at java.lang.Object.wait(Native Method)
	- waiting on java.util.TaskQueue@36fa2b88
	at java.lang.Object.wait(Object.java:502)
	at java.util.TimerThread.mainLoop(Timer.java:526)
	at java.util.TimerThread.run(Timer.java:505)

"DestroyJavaVM" Id=21 RUNNABLE

"main-Display-.macosx_nil-1-EDT-1" Id=18 TIMED_WAITING on java.util.ArrayList@4902727c
	at java.lang.Object.wait(Native Method)
	- waiting on java.util.ArrayList@4902727c
	at jogamp.newt.DefaultEDTUtil$NEDT.run(DefaultEDTUtil.java:355)

"Java2D Disposer" Id=13 WAITING on java.lang.ref.ReferenceQueue$Lock@7061856
	at java.lang.Object.wait(Native Method)
	- waiting on java.lang.ref.ReferenceQueue$Lock@7061856
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
	at sun.java2d.Disposer.run(Disposer.java:148)
	at java.lang.Thread.run(Thread.java:748)

"Java2D Queue Flusher" Id=12 TIMED_WAITING on sun.java2d.opengl.OGLRenderQueue$QueueFlusher@31141f06
	at java.lang.Object.wait(Native Method)
	- waiting on sun.java2d.opengl.OGLRenderQueue$QueueFlusher@31141f06
	at sun.java2d.opengl.OGLRenderQueue$QueueFlusher.run(OGLRenderQueue.java:203)

"AWT-AppKit" Id=10 RUNNABLE (in native)

"Signal Dispatcher" Id=4 RUNNABLE

"Finalizer" Id=3 WAITING on java.lang.ref.ReferenceQueue$Lock@56d5d4c7
	at java.lang.Object.wait(Native Method)
	- waiting on java.lang.ref.ReferenceQueue$Lock@56d5d4c7
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

"Reference Handler" Id=2 WAITING on java.lang.ref.Reference$Lock@c9eddf3
	at java.lang.Object.wait(Native Method)
	- waiting on java.lang.ref.Reference$Lock@c9eddf3
	at java.lang.Object.wait(Object.java:502)
	at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

```

I’m using processing 3.4 and java version 1.8.0\_181. I’ve seen the issue on both Windows and macOS.

How should I go about solving this? I’m unsure where to continue digging now…

Sincerely,
