Witam
Ostatnio ćwiczę trochę bardziej zaawansowaną wielowątkowość.
Chcę osiągnąć:
Są zadania (obiekty typu Callable) oraz może być jakaś maksymalna ilość tych obiektów które mają być brane do wykonania. Jeżeli zadanie już się niemieści to następuje oczekiwanie na skończenie tych poprzednich i dopiero dodanie. Ma być jakiś czas po którym nastąpi ponowna próba dodania zadania.
Dla przykładu daje maksymalnie jedno zadanie naraz. Daje też TimeOut na 10 sec ale nie bardzo to działa.
Implementacja Callable
public class CallableImpl implements Callable<String> {
private int myName;
private double temp;
CallableImpl(int i) {
myName = i;
}
public String call() {
// Tutaj operacje by było widać ze coś zadanie robi
System.out.println("GO " + myName);
for (int i = 0; i < 100000000; i++) {
int asd = 12781721 + i;
temp = asd + Math.sqrt(asd) - Math.log10(asd);
}
System.out.println("RETURN " + myName);
return "TEST " + myName;
}
public int getMyName() {
return myName;
}
public void setMyName(int myName) {
this.myName = myName;
}
}
Klasa testowa:
public static void main(String[] args) {
BlockingQueue queue = new SynchronousQueue();
ExecutorService executor = new ThreadPoolExecutor(1, 1, 10000, TimeUnit.MILLISECONDS, queue);
int numerPodejsciaZadania = 1;
while (true) {
try {
executor.submit(new CallableImpl(numerPodejsciaZadania ));
numerPodejsciaZadania ++;
} catch (Exception e) {
e.printStackTrace();
}
}
}
Zadanie nr 1 wchodzi natomiast 2 i każde następne powoduje java.util.concurrent.RejectedExecutionException i w sumie bardzo dobrze tylko od razu po tym znowu próbuje robic submit - nie ma żadnego timeout'a. Nie rozumiem jak działa ten parametr w ThreadPoolExecutor. Jak to zrealizować?