Java Multithreading con framework ExecutorService

di il
5 risposte

Java Multithreading con framework ExecutorService

Ciao a tutti
sto cercando di capire un codice java di uno schedulatore multithreading. Per la gestione dei multithread viene usato il framework ExecutiveService. Quello che non capisco è questo pezzo di codice:

ExecutorService executor = Executors.newFixedThreadPool(threadPool);//creating a pool of 5 threads
.....
......
executor.execute(process);//calling execute method of ExecutorService

con la execute viene generato un nuovo thread.
Quello che non capisco è che in fase di debug con Eclipse in console ottengo le seguenti righe di log:

[pool-1-thread-1]......
[pool-1-thread-1].......
[pool2-thread-1] <------ quando viene eseguita la seconda volta execute per istanziare un nuovo oggetto executor

Mi potete aiutare ?

Buona Pasqua a tutti

5 Risposte

  • Re: Java Multithreading con framework ExecutorService

    wally2018 ha scritto:


    con la execute viene generato un nuovo thread.
    No, non viene "generato" un nuovo thread, di per sé. Viene semplicemente eseguito un task, "lavoro". In quale thread? Dipende da come è configurato il thread-pool.

    Un thread-pool può essere configurato con diverse "politiche" di gestione dei task e dei thread. Il numero di thread deve essere fisso? Se no, il numero dei thread deve poter crescere riusando però possibilmente thread già creati? Se invece il numero è fisso, che deve succedere se si sottomette un task e tutti i thread sono occupati? Il task viene rifiutato? O semplicemente "accodato" in coda? O un task in esecuzione deve essere terminato? Insomma, questi sono solo alcuni dei ragionamenti che si possono fare con i thread-pool.

    Il newFixedThreadPool(int nThreads) crea un thread-pool ben preciso:
    - ha un numero prefissato di thread (indicato dal parametro)
    - i thread vengono ri-usati
    - i task sottomessi vengono accodati in una coda unbounded (illimitata)
  • Re: Java Multithreading con framework ExecutorService

    Scusa Andbin
    quindi io sto facendo un test con un numero di thread pari a 1 quindi:
    ExecutorService executor = Executors.newFixedThreadPool(1)
    Quindi adesso ti riassumo quanto vedo in Eclipse in Console

    2018-04-03 - main
    2018-04-03 - main
    2018-04-03 - DEBUG [pool-1-thread-1] Istanzio il primo thread ed eseguo il 1 task
    2018-04-03 - DEBUG [pool-1-thread-1] ..........................
    2018-04-03 - DEBUG [pool-1-thread-1] .................................
    2018-04-03 - DEBUG [pool-1-thread-1] .........................
    2018-04-03 - DEBUG [pool-1-thread-1] ......................
    2018-04-03 - DEBUG [pool-2-thread-1] Eseguo il secondo task con lo stesso thread
    E' corretto allora quanto ho scritto ???? Inoltre secondo quanto hai detto ci sono 2 task da eseguire per quell'unico thread. Quale funzione mi dice i task che sono messi in coda e che vengono eseguiti da quell'unico thread ?
    Grazie infinite per il tuo aiuto
  • Re: Java Multithreading con framework ExecutorService

    wally2018 ha scritto:


    2018-04-03 - main
    2018-04-03 - main
    2018-04-03 - DEBUG [pool-1-thread-1] Istanzio il primo thread ed eseguo il 1 task
    2018-04-03 - DEBUG [pool-1-thread-1] ..........................
    2018-04-03 - DEBUG [pool-1-thread-1] .................................
    2018-04-03 - DEBUG [pool-1-thread-1] .........................
    2018-04-03 - DEBUG [pool-1-thread-1] ......................
    2018-04-03 - DEBUG [pool-2-thread-1] Eseguo il secondo task con lo stesso thread
    E' corretto allora quanto ho scritto ????
    Senza sapere cosa vuoi fare e perché non ti posso dire se è "corretto".
    Dall'output si deduce una cosa: hai usato 2 thread-pool distinti. Nota il numero in rosso:

    2018-04-03 - DEBUG [pool-1-thread-1] Istanzio il primo thread ed eseguo il 1 task

    2018-04-03 - DEBUG [pool-2-thread-1] Eseguo il secondo task con lo stesso thread

    Quindi prima hai chiesto un newFixedThreadPool(1) e gli hai sottomesso il primo task. Poi dopo hai chiesto un altro newFixedThreadPool(1) e gli hai sottomesso il secondo task.
    NON è lo stesso thread! Sono due thread distinti, ciascuno appartenente ad un thread-pool diverso.

    wally2018 ha scritto:


    Quale funzione mi dice i task che sono messi in coda e che vengono eseguiti da quell'unico thread ?
    Non capisco bene la domanda: cosa vuoi sapere? Vuoi ottenere dal executor quali task sono in coda? Dalla interfaccia ExecutorService di per sé non lo puoi sapere (a meno di usare il shutdownNow() ).
    Se usi e configuri direttamente un ThreadPoolExecutor, allora puoi ottenere il riferimento alla BlockingQueue usata dal executor (e anzi, a dire il vero, quando si crea un ThreadPoolExecutor si deve passare la BlockingQueue).

    P.S. E newFixedThreadPool alla fin fine crea un ThreadPoolExecutor, solo che te lo restituisce come ExecutorService (la interfaccia).
  • Re: Java Multithreading con framework ExecutorService

    CIao Andbin
    senti allora mi confermi che ogni volta che java esegue l'istruzione seguente:
    ExecutorService executor = Executors.newFixedThreadPool(1)
    mi crea un nuovo thread per eseguire i miei task e in corrispondenza del nuovo thread un nuovo pool ?
    Saluti
  • Re: Java Multithreading con framework ExecutorService

    wally2018 ha scritto:


    ExecutorService executor = Executors.newFixedThreadPool(1)
    mi crea un nuovo thread per eseguire i miei task e in corrispondenza del nuovo thread un nuovo pool ?
    Crea un thread-pool con 1 thread fisso in cui eseguire tutti i task che sottometti a quel pool.
    (e chiaramente essendo un solo thread, i task saranno eseguiti in maniera "sequenziale", uno per volta)
Devi accedere o registrarti per scrivere nel forum
5 risposte