[ 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? |