Sfida: 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.
È 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.
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!
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
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
Sfida: 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.
È 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.
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!
Grazie per i tuoi commenti!