Estou querendo fazer uma classe que trabalhe como uma fila… por exemplo, várias outras classes vão chamar esse classe e ela irá enfileirar as requisições dessas classes, e executando uma a uma… quando acabar de executar a primeira requisição, ela sai da fila e a nova requisição é executada…
Sendo que as classes que chamam essa classe que enfileira as requisições tem que esperar pelo retorno do resultado para continuar o seu código.
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
....
public static void main(String[] args) throws InterruptedException,
ExecutionException {
final Callable<Integer> task1 = new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(5000);
System.out.println("task 1");
return 1;
}
};
final Callable<Integer> task2 = new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(1000);
System.out.println("task 2");
return 2;
}
};
// mando executar as duas tasks (isso seria mandar uma requisicao a ser
// processada no seu sistema)
Future<Integer> f1 = SuaClasseFila.exec(task1);
Future<Integer> f2 = SuaClasseFila.exec(task2);
// qdo faz um get em um objeto Future (java.util.concurrent.Future), ele
// trava e espera o retorno (ateh que seja processado), isso iria
// caracterizar a classe chamadora esperar pelo resultado, porem dando a
// vantagem de ela nao esperar :P ou seja, fica melhor, ela espera se quiser
System.out.println(f1.get());
System.out.println(f2.get());
}
E aqui a sua classe “fila” executora
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class SuaClasseFila {
// aqui cria um executor com no maximo 1 thread, ou seja, executa uma
// coisa de cada vez, esperimente colocar 2 ali, vc vai ver que a task1
// e task2 vaum executar concorrentemente, mas como vc quer uma execução
// em fila, o valor ideial sera 1
public static ExecutorService e = Executors.newFixedThreadPool(1);
public static <T> Future<T> exec(Callable<T> task) {
return e.submit(task);
}
}
Preste atenção nisso:
ExecutorService e = Executors.newFixedThreadPool(1)