From 0b45bda64516af36577e6c72e2a0175a2f51701d Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Wed, 11 Jun 2014 15:05:55 +0200 Subject: getBrands: Fix hang when done For producer thread 0 and consumer threads 1 and 2 0:queue size = 0 1:get(); hangs... 2:get(); hangs... 0:put suicide pill 1:get resumes, exits Observe that 2:get is still running (deadlocks). To "fix" this, add multiple suicide pills. The current value (16) allows up to 16 concurrent workers. --- src/database/BrandAnalyzerQueue.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/database/BrandAnalyzerQueue.java b/src/database/BrandAnalyzerQueue.java index f6b0a40..af5ba7c 100644 --- a/src/database/BrandAnalyzerQueue.java +++ b/src/database/BrandAnalyzerQueue.java @@ -42,7 +42,10 @@ public class BrandAnalyzerQueue implements Runnable { } try { last = true; - queue.put(new Result(-1, null)); + // for each concurrent worker, there must be at least one killer + for (int i = 0; i < 16; i++) { + queue.put(new Result(-1, null)); + } } catch (InterruptedException ex) { getLogger().log(Level.SEVERE, "Failed to insert suicide pill!"); } -- cgit v1.2.1