[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