14. august 2002 - 22:40Der er
3 kommentarer og 1 løsning
queue
hejsan. jeg sad lige og legede med at få lavet et smart queue system et irc framework jeg arbejder på. ideen er at jeg vil have en seperat tråd til at udføre arbejdet med at sende tekst strenge til outputstreamen.
Jeg har derfor konstrueret en fifo queue der simpelt fungerer ved at threads fra mit framework kan kalde en metode der smider en tekststreng ind i queue'en. Problemet er så at queuen naturligvis er tom lang tid, og det er derfor ikke særligt smart at den tråd der skal sende står og bruger cpu tid hele tiden. Jeg har forsøgt at bruge wait() og notify() til at kunne stoppe tråden når queue'en var tom, og så lade "add" metoden starte den op igen ved nye entryes, men så får jeg forskellige exceptions der siger at jeg ikke ejer monitoren på threaden..
Mit spørgsmål er altså om nogen kan vise en opbygning hvor man kan bruge wait()/notify() til at lave en queue med læse-tråd, eller en anden smart opbyning til at opnå lignende opførsel.
public class BoundedBuffer { private int upperBound; private java.util.LinkedList buffer;
public BoundedBuffer(int upperBound) { this.upperBound = upperBound; buffer = new java.util.LinkedList(); }
public synchronized void push(Object obj) { //denne while er løsningen på dit problem (guarded suspension) while(buffer.size() >= upperBound) { try { wait(); } catch(InterruptedException e) { e.printStackTrace(); } }
buffer.addLast(obj);
if(buffer.size() == 1) notify(); // væk én tråd, som venter på monitor else notifyAll(); // væk alle tråde, som venter på monitor }
takker =) fandt lige ud af at problemet var at jeg ikke holdte den samme monitor når jeg forsøgte at notify() som når min tråd waitede.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.