[ Texas Instruments @ 25.01.2012. 12:54 ] @
Pišem neku aplikaciju koja treba da prima sa nekog uređaja nekakav niz bajtova i da to ispiše na ekran (za sad, verovatno će biti potreban upis u nekakav datastore ili fajl). U klasi Server imam pool niti ExectuorService koji se kreira prilikom pokretanja servera. 10 niti se kreira.
Code:

public Server(int port, int poolSize) throws IOException {
    serverSocket = new ServerSocket(port);
    poolThreads = Executors.newFixedThreadPool(poolSize);
}


U klasi server imam i sledeće definicije objekata za sinhronizaciju niti prilikom čitanja podataka i ispisa na ekran.
Code:

private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true);
private final Lock writeLock = rwLock.writeLock();


Server izvršava metodu serve, koja prihvata konekciju i prosleđuje socket i writeLock niti za obradu.
Code:

public void serve() {
    try {
        while (!shutdown) {
            Socket socket = serverSocket.accept();
            poolThreads.execute(new ServerThread(socket, writeLock));
        }
    } catch (IOException e) {
        poolThreads.shutdown(); 
    }
}


U klasi ServerThread run metoda samo poziva metod processRequest koji izgleda ovako.
Code:

private void processRequest(Socket socket) {
    writeLock.lock();
    try {
        is = socket.getInputStream();
        is.read(buffer);
                for (int i = 0; i < buffer.length; i++)
                     System.out.print(buffer[i]);
                System.out.println();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        closeSocket();
        writeLock.unlock();
    }
}


Kada pokrenem server pa pustim taj uređaj da šalje podatke, desi mi se da ispiše prvi put to što treba i nakon toga stoji. Ako prvo pustim uređaj da šalje podatke, pa potom pokrenem server radi ok. Ne znam u čemu bi mogao da bude problem?
[ Nemanja @ 31.01.2012. 10:04 ] @
Pokusaj sa ...

Code:

boolean lock = false;

                do {

                    try {

                        poolThreads.execute(new ServerThread(socket, writeLock));
                        lock = true;

                    } catch (RejectedExecutionException e) {

                        logger.warn("Retrying to add task to the pool...");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e1) {
                            // TODO Auto-generated catch block
                        }
                    }
                } while (!lock);


Moguce je da "gubis" taskove ...
[ Texas Instruments @ 03.02.2012. 22:00 ] @
Izvinjavam se što kasnim sa odgovorom. Problem je zapravo u tome što je read blokirajuć metod, a meni se dešavalo da se taj uređaj na početku ne incijalizuje dobro i pošalje mi nekad manje bajtova nego što ja očekujem da primim. Problem sam rešio time što proveravam da li ima podataka u ulaznom strimu, metodom available i tada radim čitanje.
[ Nemanja @ 04.02.2012. 21:48 ] @
Bitno da si resio :)