Ciao provo ad aiutarti con un esempio, ti posto il codice di alcune classi che realizzano una comunicazione da tra due thread. In pratica abbiamo una classe principale che avvia due thread.La struttura condivisa è un'istanza della classe basket, la simulazione è questa: un thread mette simbolicamente una palla nel basket, poi attende la notifica dall'altro Thread che deve toglierla dal basket, quest'ultimo la toglie dal basket e poi notifica il primo che quindi ne mette una nuova e cosi via.. fino al momento in cui il MAIN invia i segnali di interruzione ai due thread. Il tutto poggia su blocchi synchronized a livello di oggetto, wait(),notify() ed interrupt.
La classe che modella la struttura condivisa:
public class Basket {
private boolean empty=true;
public boolean isEmpty() {
return empty;
}
public void setEmpty(boolean empty) {
this.empty = empty;
}
}
Il thread che inserisce:
public class Push extends Thread{
private final Basket basket;
public Push(Basket basket){
this.basket = basket;
}
@Override
public void run(){
while(!isInterrupted()) {
synchronized(basket){
if(basket.isEmpty()) {
basket.setEmpty(false);
System.out.println("PUSH: ball in the basket,ok");
}
basket.notifyAll();
try {
basket.wait();
} catch (InterruptedException ex) {
/* L'eccezione cancella lo stato di interrupt
* se si è verificata come thread devo comunque
* terminare
*/
interrupt();
}
}
}
System.out.println("PUSH: interrupted");
}
}
Il thread che estrae:
public class Pull extends Thread {
private final Basket basket;
public Pull(Basket basket){
this.basket = basket;
}
@Override
public void run(){
while(!isInterrupted()) {
synchronized(basket){
if(!basket.isEmpty()){
basket.setEmpty(true);
System.out.println("PULL: ball from the basket,ok");
}
basket.notifyAll();
try {
basket.wait();
} catch (InterruptedException ex) {
if(!basket.isEmpty()){
basket.setEmpty(true);
System.out.println("PULL: ball from the basket,ok");
}
/* L'eccezione cancella lo stato di interrupt
* se si è verificata come thread devo comunque
* terminare
*/
interrupt();
}
}
}
System.out.println("PULL: interrupted");
}
}
L'applicazione per la imulazione:
public class BasketDemo {
public static void main(String[] args){
Basket basket = new Basket();
Pull pull = new Pull(basket);
Push push = new Push(basket);
pull.start();
push.start();
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
pull.interrupt();
push.interrupt();
try {
pull.join();
push.join();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
dovresti avere una stampa simile a questa:
PUSH: ball in the basket,ok
PULL: ball from the basket,ok
PUSH: ball in the basket,ok
PULL: ball from the basket,ok
PUSH: ball in the basket,ok
PULL: ball from the basket,ok
.....
.....
PULL: interrupted
PUSH: interrupted
spero di esserti stato di aiuto.