guarda ti posto l'esercizio che volevo fare:
inserire in una risorsa (arraylist) delle stringhe di un array. come puoi vedere nel main. Dividendo il lavoro tra due tread di tipo1 ,predisposti a fare un solo inserimento e poi cedere il lock al thread t2 per stampare tutto l'array list .Diciamo che qualcosa sono riuscito a fare solo che non funziona bene perchè non mi stampa tutti e 40 le celle e va in loop.. Gli puoi dare un occhiata
codice:
public class ThreadDiTipoUNO extends Thread{
private int inizio;
private int fine;
private String array[];
RisorsaSuCuiLav buffer;
public ThreadDiTipoUNO(int i , int f , String a[], RisorsaSuCuiLav r) {
inizio=i;
fine=f;
array=a;
buffer=r;
}
public void run(){
try{
while(inizio<fine){
buffer.immetti(array[inizio]);
inizio++;
}
}catch (Exception e) {
// TODO: handle exception
}
}
}
public class ThreadDiTipoDUE extends Thread{
RisorsaSuCuiLav buffer;
public ThreadDiTipoDUE( RisorsaSuCuiLav r) {
buffer=r;
}
public void run(){
buffer.stampa();
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class RisorsaSuCuiLav<T> {
private Lock lock = new ReentrantLock();
private final Condition condizDiBloccoImmiss = lock.newCondition();
private final Condition condizDiBloccoStampa= lock.newCondition();
private int ins;
ArrayList<T> buffer=new ArrayList<T>();
public RisorsaSuCuiLav() {
ins=0;
}
public void immetti(T ri){
lock.lock();
try{//1tr
if(ins==1)
condizDiBloccoStampa.signal();
while(ins==1)
try{//2tr
condizDiBloccoImmiss.await();
}//2tr
catch (Exception e) { }
buffer.add(ri);
ins++;
}//1tr
finally
{
lock.unlock();
}
}
public void stampa(){
//invocato da thread di tipo2
lock.lock();
try{//1tr
while(true){
while(ins == 0){
condizDiBloccoStampa.await();
}
Iterator<T> it=buffer.iterator();
while(it.hasNext() ){
T element = it.next();
System.out.print(" "+element);
}
System.out.println();
ins = 0;
condizDiBloccoImmiss.signal();
}
}
catch (Exception e) {
// TODO: handle exception
}
finally
{
lock.unlock();
}
}
}
public class MainProvaThread {
public static void main(String[] args) {
String array[]=new String[40];
array[0]="1";
array[1]="2";
array[2]="3";
array[3]="4";
array[4]="5";
array[5]="6";
array[6]="7";
array[7]="8";
array[8]="9";
array[9]="10";
array[10]="11";
array[11]="12";
array[12]="13";
array[13]="14";
array[14]="15";
array[15]="16";
array[16]="17";
array[17]="18";
array[18]="19";
array[19]="20";
array[20]="21";
array[21]="22";
array[22]="23";
array[23]="24";
array[24]="25";
array[25]="26";
array[26]="27";
array[27]="28";
array[28]="29";
array[29]="30";
array[30]="31";
array[31]="32 ";
array[32]="33";
array[33]="34";
array[34]="35";
array[35]="36";
array[36]="37";
array[37]="38";
array[38]="39";
array[39]="40";
RisorsaSuCuiLav<String> buffer=new RisorsaSuCuiLav<String>();
ThreadDiTipoUNO t1[]=new ThreadDiTipoUNO[2];
int inizio=0;
int fine=array.length/2;
for(int i=0 ; i<t1.length ; i++){
t1[i]=new ThreadDiTipoUNO(inizio,fine,array,buffer);
t1[i].start();
inizio=fine;
fine=inizio+fine;
}
ThreadDiTipoDUE t2=new ThreadDiTipoDUE(buffer);
t2.start();
}//chiusura main
}