diff options
author | Peter Wu <peter@lekensteyn.nl> | 2014-06-11 15:05:55 +0200 |
---|---|---|
committer | Peter Wu <peter@lekensteyn.nl> | 2014-06-11 15:05:55 +0200 |
commit | 0b45bda64516af36577e6c72e2a0175a2f51701d (patch) | |
tree | f33238ca6c627e650344740f761419ad3c70b7d7 /src | |
parent | c7a805b5b4db27d88bf7decdfc198a17881981a8 (diff) | |
download | Goldfarmer-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/database/BrandAnalyzerQueue.java | 5 |
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!"); } |