Witam ponownie,
Mam kłopot z poprawną obsługą ArrayListy przez wiele wątków. Gdy któryś wątek usuwa element z listy, nie zawsze po tej operacji otrzymuję poprawny rozmiar listy po wywołaniu metody .size(). Raz jest dobrze, raz źle, ogólne randomowo to trochę działa. Po usunięciu danego elementu sprawdzam metodą .contains() czy obiekt faktycznie został usunięty i za każdym razem tak się dzieje. Czy ktoś mógłby mi wytłumaczyć co robię źle? Idea programu jest taka, że kolejne wątki klientów próbują się dostać do muzeum, które ma określoną pojemność.
Klasa Muzeum:
import java.util.ArrayList;
public class Muzeum {
private ArrayList<Klient> clients;
public int size=0;
public Muzeum(int size) {
this.size=size;
clients=new ArrayList<Klient>(size);
clients.trimToSize();
}
public synchronized void enterMuseum (Klient k) {
if(clients.size()<size) {
clients.add(k);
System.out.println(clients.contains(k));
System.out.println("Client: "+k.clientID + " entered. INSIDE: " + howManyInside());
}
else
{
System.out.println("Room is full");
}
}
public synchronized void leaveMuseum(Klient k) {
clients.remove(k);
System.out.println(clients.contains(k));
System.out.println("Client: "+ k.clientID+ " left. INSIDE: " + howManyInside());
}
public int howManyInside () {
return clients.size();
}
}
Klasa Klient:
public class Klient implements Runnable {
public int clientID;
public Muzeum muzeum;
public long time;
public Klient(int id, Muzeum muzeum) {
clientID=id;
this.muzeum=muzeum;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
time=(long)(Math.random()*15);
Thread.sleep(time*1000);
} catch(Exception e) {
}
muzeum.enterMuseum(this);
try {
time=(long)(Math.random()*100);
Thread.sleep(time*1000);
} catch (Exception e) {
}
muzeum.leaveMuseum(this);
}
}
}
Odpalenie w mainie:
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Muzeum muzeum=new Muzeum(2);
for(int i=0;i<4;i++) {
new Thread(new Klient(i, muzeum)).start();
}
}
}
dodanie znaczników <code class="java"> - Furious Programming