私は3つのクラスを持っています.1つはURLの山を表すことを意図しています
private Queue<String> queue = new LinkedList<String>();
public Queue<String> getQueue() {
return queue;
}
private int limit = 5;
private int stillParsing;
public synchronized String getNextString() throws InterruptedException {
while (queue.isEmpty()||stillParsing > limit) {
System.out.println("no for you "+ queue.peek());
wait();
}
System.out.println("grabbed");
notify();
stillParsing++;
System.out.println(queue.peek());
return queue.remove();
}
public synchronized void doneParsing() {
stillParsing--;
}
}
run メソッドが
public void run(){
try {
sleep(30);
for(;;){
String currenturl = pile.getNextString();
//(do things)
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
pile.doneParsing();
}
}
そして、このスニペットを使用して実際にオブジェクトを URL の山に追加するマッパー
while (urls.hasMoreTokens()) {
try{
word.set(urls.nextToken());
String currenturl = word.toString();
System.out.println(currenturl);
pile.getQueue().add(currenturl);
デバッグから、マッパーがキューにデータを入力する前に、すべてのスレッドが一度にキューから取得しようとし、待機状態になると思います。残念ながら、待機中のすべてのスレッドが原因で、プログラムがハングアップし、キューに URL が追加されません。この問題に対処するにはどうすればよいですか?できれば、まだ待機通知を使用している間。