Compiti integrativi che potete opzionalmente fare a casa prima della prossima lezione: 1. Prendere in esame la documentazione della classe Thread https://goo.gl/2c7ebJ; 2. Prendere in esame la documentazione dell'interfaccia Lock https://goo.gl/jAJiRl e della sua implementazione ReentrantLock https://goo.gl/sdHIHt 3. Usando il codice di esempio introdotto oggi a lezione, provare a: a. introdurre molteplici Thread, ciascuno dei quali stampa un carattere diverso; b. verificare la differenza tra l'invocazione di run() di un thread direttamente, e l'invocazione di start(); c. verificare cosa succede se si usa una istanza della classe StampaDisciplinata (ad esempio una diversa per ciascun thread) d. Disciplinare il codice in maniera tale che ogni thread possa stampare 10 righe consecutive di simboli senza interferenze; e. verificare cosa succede sostituendo al codice for(int i = 0; i <= 25; i++) System.out.print(c); il codice: System.out.println(striscia) dove striscia è una stringa di 25 elementi già preconfezionati. 4. Misurare la differenza di performance tra un lock fair e uno unfair (il primo si costruisce così: Lock l = new ReentrantLock(true)). Suggerimento: usare un certo numero di thread molto CPU-bound con un metodo run del tipo void run() { while(*un certo numero di iterazioni*) { l.lock(); i++; l.unlock(); } }. Per misurare il tempo, potete giocare con System.currentTimeMillis(), o System.nanoTime() Il sorgente https://goo.gl/rwGRJN.