[Java lista] Queue - thread - kiíratás
Peter Verhas
peter at verhas.com
2010. Jún. 9., Sze, 11:38:52 CEST
Mi ezt a kis segéd osztályt használtuk erre pár évvel ezelőtt. Azóta
van 1.5 Java és abban ConcurrentLinkedQueue. Azóta azt még nem néztem,
de kb. ugyanez.
Talán maga a kód tanulságos lehet, de valószínűleg inkább a
ConcurrentLinkedQueue-t használnám.
Péter
package com.verhas.util;
import java.util.LinkedList;
/**
* A simple memory queue implementation that may help synchronization between
* threads. The implementation of this class was inspired by the jPOS Space
* implementation. This class is much simpler, implementing only one queue
* that can be use to synchronize instead of a Hash of queues.
* <p>
* This implementation is very simple. It does not contains any persistence.
* This is mainly to synchronize between threads. For any more complex
* applications utilize JMS.
* <p>
* Known issue: when you call {@code receive(timeout)} the code may not return
* after {@code timeout} millis. This may happen if another thread waits for the
* top element of the queue with a longer timeout.
* <p>
* You can avoid this issue if all threads receiving from the queue use the same
* timeout value.
* <p>
* @author Peter Verhas <peter at verhas.com>
*/
public class MemoryQueue {
protected LinkedList list = new LinkedList();
public MemoryQueue() {
}
/**
* Send an object into the queue.
*
* @param value
*/
public synchronized void send(Object value) {
if (value == null) {
throw new NullPointerException("You can not send null into
a queue.");
}
synchronized (this) {
list.add(value);
this.notifyAll();
}
}
/**
* Gets out the top element of the queue. This is an asynchronous version
* that returns {@code null} if the queue is empty.
* <p>
*
* @return an object from the queue or {@code null}.
*/
private synchronized Object receiveAsync() {
Object obj = list.isEmpty() ? null : list.get(0);
if (obj != null) {
list.remove(0);
}
return obj;
}
/**
* Get the top element of the queue. Wait infinitely until there is an
* element available.
*
* @return an object from the queue.
*/
public synchronized Object receive() {
Object obj;
while ((obj = receiveAsync()) == null) {
try {
this.wait();
} catch (InterruptedException e) {
}
}
return obj;
}
private synchronized Object receiveTill(long end) {
Object obj = null;
long now;
while ((obj = receiveAsync()) == null &&
((now = System.currentTimeMillis()) < end)) {
try {
this.wait(end - now);
} catch (InterruptedException e) {
}
}
return obj;
}
/**
* Get the top element of the queue or return {@code null} if there is none
* within {@code timeout} millis.
*
* @param timeout
* @return the object or null
*/
public Object receive(long timeout) {
long now = System.currentTimeMillis();
long end = now + timeout;
return receiveTill(end);
}
}
2010/6/9 Levi <levpista at freemail.hu>:
> Sziasztok!
> Ötleteket, vagy javaslatokat szeretnék kérni tőletek a következő
> problémámra:
> Van egy számolásigényes feladat.
> Szeretnék részeredményeket kiíratni, de ezt nem a fő szálban, mert az nagyon
> lelassítaná a folyamatot.
> Arra gondoltam, hogy lenne egy FIFO queue, amibe a számolás során bedobálom
> a kiírandó részeredményeket.
> A program elején elindulna egy szál, ami csak ezt a queue-t pollozná, és ha
> van benne elem, akkor azt kiírná a konzolra.
> Valaki készített már hasonló feladatot?
> Várhatok a megoldástól (ha helyesen gondolom egyáltalán), hogy a számolás
> nem fog belassulni?
> Van tapasztalatotok, esetleg progitok ezzel kapcsolatban?
> Üdv,
> Levi
>
> _______________________________________________
> Javalist mailing list
> Javalist at javagrund.hu
> http://javagrund.hu/mailman/listinfo/javalist
>
>
--
Verhás Péter
ügyvezető
Verhás & Verhás Szoftver Manufaktúra Kft.
peter at verhas.com
t: +36(30)9306805
skype: verhas
További információk a(z) Javalist levelezőlistáról