/**
*
*/
package edu.berkeley.nlp.PCFGLA;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import edu.berkeley.nlp.syntax.Tree;
import edu.berkeley.nlp.util.PriorityQueue;
/**
* @author petrov
*
*/
public class MultiThreadedParserWrapper {
int nThreads;
boolean allBusy;
PriorityQueue<List<Tree<String>>> queue;
int lastReturned, lastSubmitted;
ConstrainedArrayParser[] parsers;
ExecutorService pool;
Future[] submits;
public MultiThreadedParserWrapper(ConstrainedArrayParser parser, int threads){
nThreads = threads;
pool = Executors.newFixedThreadPool(nThreads);
submits = new Future[nThreads];
parsers = new ConstrainedArrayParser[nThreads];
queue = new PriorityQueue<List<Tree<String>>>();
parsers[0] = parser;
parsers[0].setID(0,queue);
for (int i=0; i<nThreads;i++){
parsers[i] = parser.newInstance();
parsers[i].setID(i,queue);
}
lastSubmitted = 0;
lastReturned = -1;
}
public boolean isDone(){
return (lastSubmitted-1==lastReturned);
}
public boolean hasNext(){
// synchronized(queue) {
if (!queue.hasNext()) return false;
double next = -queue.getPriority();
return next == lastReturned + 1;
// }
}
public List<Tree<String>> getNext(){
if (!hasNext()) return null;
lastReturned++;
synchronized(queue) {
List<Tree<String>> result = queue.next();
queue.notifyAll();
return result;
}
}
public void parseThisSentence(List<String> sentence){
// go through threads and submit this sentence to the next available thread, after getting the threads last result
synchronized(queue) {
while (true) {
for (int i=0; i<nThreads;i++){
if (submits[i]==null||submits[i].isDone()){
parsers[i].setNextSentence(sentence, lastSubmitted++);
// System.out.println(queue.size());
// System.out.println(lastSubmitted);
submits[i] = pool.submit(parsers[i]);
return;
}
}
try { queue.wait(); }
catch (InterruptedException ignored) { }
}
}
}
}