Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Serverska aplikacija sa pool-om niti - deadlock?

[es] :: Java :: Serverska aplikacija sa pool-om niti - deadlock?

[ Pregleda: 1772 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Texas Instruments

Član broj: 227540
Poruke: 272
*.amres.ac.rs.



+61 Profil

icon Serverska aplikacija sa pool-om niti - deadlock?25.01.2012. u 12:54 - pre 149 meseci
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?
 
Odgovor na temu

Nemanja
Informatiker

Član broj: 4663
Poruke: 1539
*.sonydadc.com.



+583 Profil

icon Re: Serverska aplikacija sa pool-om niti - deadlock?31.01.2012. u 10:04 - pre 148 meseci
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 ...
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Re: Serverska aplikacija sa pool-om niti - deadlock?03.02.2012. u 22:00 - pre 148 meseci
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.
 
Odgovor na temu

Nemanja
Informatiker

Član broj: 4663
Poruke: 1539
80.120.42.*



+583 Profil

icon Re: Serverska aplikacija sa pool-om niti - deadlock?04.02.2012. u 21:48 - pre 148 meseci
Bitno da si resio :)
 
Odgovor na temu

[es] :: Java :: Serverska aplikacija sa pool-om niti - deadlock?

[ Pregleda: 1772 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.