[Java lista] szinkronizalas
Tamás Viktor
viktor.tamas at gmail.com
2008. Sze. 29., H, 14:27:36 CEST
Pl. aszinkron-szinkron kommunikacio-atalakito.
private static class Slot {
public Byte id;
public byte[] result;
}
...
private Map<Byte, Slot> slots = Collections.synchronizedMap(new
HashMap<Byte, Slot>());
//This is running inside an infinite loop, reading an input stream.
private void receive(byte[] result) {
Slot s = slots.get(result[0]);
synchronized(s) {
s.result = result;
s.notifyAll();
}
}
public byte[] send(byte[] pkg) throws InterruptedException {
//... sending package to device
Slot s = new Slot();
synchronized(s) {
slots.put(pkg[0], s);
s.wait();
}
return s.result;
}
A send metodust meghivod, de a device nem ad rogton vissza valaszt, hanem
egy input stream-et folyamatosan olvasva egyszer majd visszajon az eredmeny.
A Slot egy segedobjektum, ami gyakorlatilag a valaszt varja.
Ha a send metodust szinkronizalnank le az egesz objektumra az meggatolna,
hogy egyidejuleg tobb package-t kuldjunk ki es ez rontana a hatekonysagot,
foleg
hosszu kikuldendo package-k eseten.
A fenti kod kicsit slendrian, csak az elvet mutatja.
Akinek van kedve reszelgetheti, hogy mukodokepes es szep legyen.
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: http://javagrund.hu/pipermail/javalist/attachments/20080929/8d07b33c/attachment.html
További információk a(z) Javalist levelezőlistáról