summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-06-11 15:05:55 +0200
committerPeter Wu <peter@lekensteyn.nl>2014-06-11 15:05:55 +0200
commit0b45bda64516af36577e6c72e2a0175a2f51701d (patch)
treef33238ca6c627e650344740f761419ad3c70b7d7
parentc7a805b5b4db27d88bf7decdfc198a17881981a8 (diff)
downloadGoldfarmer-0b45bda64516af36577e6c72e2a0175a2f51701d.tar.gz
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.
-rw-r--r--src/database/BrandAnalyzerQueue.java5
1 files changed, 4 insertions, 1 deletions
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!");
}