Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Sfida: BlockingQueue | Collezioni Sincronizzate
Multithreading in Java

bookSfida: BlockingQueue

Compito

Sarà necessario implementare alcuni metodi di BlockingQueue per comprendere meglio il funzionamento della collezione stessa e approfondire il materiale!

È necessario accedere a BlockingQueueueImpl, dove nella classe stessa saranno presenti 2 metodi non implementati che dovrai realizzare autonomamente. Non è necessario ideare una soluzione complessa, basta replicare la funzionalità di una normale BlockingQueueue.

Note
Nota

È presente anche una classe Main in cui dovrai testare la tua BlockingQueueueImpl per verificarne il corretto funzionamento.

È possibile verificarlo aggiungendo più di 10 elementi alla queue (o più del limit inizializzato nel costruttore) e il prossimo elemento dovrà attendere finché non ci saranno meno elementi nella coda rispetto al limite e solo allora sarà possibile inserire il prossimo elemento.

put() - metodo sincronizzato che aggiunge elementi alla coda se il limite della coda non è stato superato; in caso contrario, mette in pausa la coda

take() - metodo sincronizzato che preleva un elemento dalla coda, lo restituisce e lo rimuove; se la coda è vuota, la mette in pausa

Suggerimento per la soluzione

Per implementare put() è necessario verificare se la coda è piena, ovvero se non è uguale al limite e, in tal caso, mettere in pausa il thread. Se non è piena, occorre controllare se la coda è vuota (isEmpty()) e, se il thread è vuoto, chiamare il metodo che rilascia tutti i thread (notifyAll()). Successivamente, aggiungere l'elemento alla queue.

Per implementare take() è necessario verificare se la coda è vuota; se è vuota, mettere in pausa il thread (perché non c'è nulla da leggere), se la coda non è vuota effettuare un ulteriore controllo sulla completezza della lista e, se la dimensione della lista è uguale al limit, rilasciare tutti i thread e restituire il primo elemento nella coda (quello aggiunto prima degli altri).

Metodi necessari da utilizzare

  • wait() - mette in pausa il thread;
  • notifyAll() - risveglia tutti i thread in pausa;
  • queue.isEmpty() - verifica se la coda è vuota (true - la coda è vuota).

Dopo aver implementato questi metodi ed effettuato i test nella classe Main, vai su /src/test/java/BlockingQueueueImplTest.java ed esegui tutti i test.

Se vengono eseguiti con successo, congratulazioni, hai svolto tutto correttamente! In caso contrario, hai fornito una soluzione errata oppure hai modificato qualcosa che non doveva essere cambiato.

Note
Nota

Prova anche a risolvere il problema autonomamente, ma se non ci riesci e vuoi conoscere la risposta, è disponibile un link alla soluzione. Tuttavia, non limitarti a copiare il codice, ma cerca di comprenderlo!

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 4

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Suggested prompts:

Can you explain how the put() and take() methods should handle thread synchronization?

What should I do if my implementation causes deadlocks or threads to hang?

Can you give an example of how to test the BlockingQueueImpl in the Main class?

Awesome!

Completion rate improved to 3.33

bookSfida: BlockingQueue

Scorri per mostrare il menu

Compito

Sarà necessario implementare alcuni metodi di BlockingQueue per comprendere meglio il funzionamento della collezione stessa e approfondire il materiale!

È necessario accedere a BlockingQueueueImpl, dove nella classe stessa saranno presenti 2 metodi non implementati che dovrai realizzare autonomamente. Non è necessario ideare una soluzione complessa, basta replicare la funzionalità di una normale BlockingQueueue.

Note
Nota

È presente anche una classe Main in cui dovrai testare la tua BlockingQueueueImpl per verificarne il corretto funzionamento.

È possibile verificarlo aggiungendo più di 10 elementi alla queue (o più del limit inizializzato nel costruttore) e il prossimo elemento dovrà attendere finché non ci saranno meno elementi nella coda rispetto al limite e solo allora sarà possibile inserire il prossimo elemento.

put() - metodo sincronizzato che aggiunge elementi alla coda se il limite della coda non è stato superato; in caso contrario, mette in pausa la coda

take() - metodo sincronizzato che preleva un elemento dalla coda, lo restituisce e lo rimuove; se la coda è vuota, la mette in pausa

Suggerimento per la soluzione

Per implementare put() è necessario verificare se la coda è piena, ovvero se non è uguale al limite e, in tal caso, mettere in pausa il thread. Se non è piena, occorre controllare se la coda è vuota (isEmpty()) e, se il thread è vuoto, chiamare il metodo che rilascia tutti i thread (notifyAll()). Successivamente, aggiungere l'elemento alla queue.

Per implementare take() è necessario verificare se la coda è vuota; se è vuota, mettere in pausa il thread (perché non c'è nulla da leggere), se la coda non è vuota effettuare un ulteriore controllo sulla completezza della lista e, se la dimensione della lista è uguale al limit, rilasciare tutti i thread e restituire il primo elemento nella coda (quello aggiunto prima degli altri).

Metodi necessari da utilizzare

  • wait() - mette in pausa il thread;
  • notifyAll() - risveglia tutti i thread in pausa;
  • queue.isEmpty() - verifica se la coda è vuota (true - la coda è vuota).

Dopo aver implementato questi metodi ed effettuato i test nella classe Main, vai su /src/test/java/BlockingQueueueImplTest.java ed esegui tutti i test.

Se vengono eseguiti con successo, congratulazioni, hai svolto tutto correttamente! In caso contrario, hai fornito una soluzione errata oppure hai modificato qualcosa che non doveva essere cambiato.

Note
Nota

Prova anche a risolvere il problema autonomamente, ma se non ci riesci e vuoi conoscere la risposta, è disponibile un link alla soluzione. Tuttavia, non limitarti a copiare il codice, ma cerca di comprenderlo!

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 4
some-alt