Meu programa possui Clientes, que vao até uma Agencia Bancaria e cada cliente é atendido por um Caixa, sao 5 Caixas ao todo.
Cada Cliente possui uma Arraylist de requisicoes para fazer ao caixa.
Tem uma classe produtor que implementa Runnable e vai colocando Clientes em uma ArrayBlockingQueue com o metodo put().
Tem a classe Caixa que implementa Runnable e vai pegando cada Cliente do ArrayBlockingQueue com o metodo take().
package Threads;
public class Requisicao{
//Se talaoCheque=true, entao a requisicao e de talao de cheques
private boolean talaoCheque;
private boolean realizado;
public Requisicao(boolean talaoCheque){
this.talaoCheque = talaoCheque;
realizado = false;
}
public Requisicao(){
this.talaoCheque = false;
}
public boolean getRealizado(){
return realizado;
}
public void setRealizado(boolean realizado){
this.realizado = realizado;
}
public boolean getRequisicao(){
return talaoCheque;
}
}
package Threads;
import java.util.ArrayList;
import java.util.Random;
public class Cliente {
private ArrayList<Requisicao> listRequisicoes;
private boolean clientePreferencial;
private static Random gerador = new Random();
private int numeroRequisicoes;
//atrib teste
private int nome;
//metodo teste
public void setNome(int x){
nome = x;
}
//metodo teste
public int getNome(){
return nome;
}
public Cliente(){
listRequisicoes = new ArrayList<Requisicao>();
numeroRequisicoes = gerador.nextInt(5)+1;
clientePreferencial = false;
geradorRequisicoes();
}
public Cliente(boolean clientePreferencial, int nome){
listRequisicoes = new ArrayList<Requisicao>();
//Gera numero de requisicoes. Aprimorar.
numeroRequisicoes = gerador.nextInt(5)+1;
this.clientePreferencial = clientePreferencial;
geradorRequisicoes();
this.nome = nome;
}
private void geradorRequisicoes(){
int randomRequisitos = 0;
for(int i = 0; i < numeroRequisicoes; i++){
randomRequisitos = gerador.nextInt(10)+1;
if(randomRequisitos <= 2){
listRequisicoes.add(new Requisicao(true));
}
else{
listRequisicoes.add(new Requisicao(false));
}
}
}
public boolean getClientePreferencial(){
return clientePreferencial;
}
public ArrayList<Requisicao> getListaRequisicoes(){
return listRequisicoes;
}
}
package Threads;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
public class Produtor implements Runnable {
private final BlockingQueue<Cliente> filaClientes;
private Random gerador = new Random();
private int tamanho;
public Produtor(int tamanho, BlockingQueue<Cliente> filaClientes) {
this.filaClientes = filaClientes;
this.tamanho = tamanho;
}
public void run() {
try {
for (int i = 0; i < tamanho; i++) {
int contador = gerador.nextInt(10) + 1;
if (contador <= 4) {
filaClientes.put(new Cliente(true, i));
} else {
filaClientes.put(new Cliente(false, i));
}
System.out.println("Chegando cliente...");
}
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
}
}
/*
package Threads;
import java.util.concurrent.BlockingQueue;
public class Caixa implements Runnable {
private boolean preferencial;
private int numeroCaixa;
private final BlockingQueue<Cliente> filaClientes;
public Caixa(int numeroCaixa, boolean preferencial, BlockingQueue<Cliente> filaClientes){
this.numeroCaixa = numeroCaixa;
this.preferencial = preferencial;
this.filaClientes = filaClientes;
}
public int getNumeroCaixa(){
return numeroCaixa;
}
public void run(){
while(true){
try {
Thread.sleep(2000);
System.out.println("Caixa: " + getNumeroCaixa() + " Atendendo cliente: " + filaClientes.take().getNome());
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
}
}
}
package Threads;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Agencia {
public static void main(String args[]) {
ArrayBlockingQueue<Cliente> filaClientes = new ArrayBlockingQueue<Cliente>(100);
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(new Produtor(30, filaClientes));
executor.execute(new Caixa(1, false, filaClientes));
executor.execute(new Caixa(2, false, filaClientes));
executor.execute(new Caixa(3, false, filaClientes));
executor.execute(new Caixa(4, false, filaClientes));
executor.execute(new Caixa(5, false, filaClientes));
executor.shutdown();
}
}
O resultado da execução é:
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Chegando cliente...
Caixa: 1 Atendendo cliente: 0
Caixa: 3 Atendendo cliente: 2
Caixa: 2 Atendendo cliente: 3
Caixa: 4 Atendendo cliente: 1
Caixa: 5 Atendendo cliente: 4
Continua...
Ou seja, os clientes estão sendo pegos do ArrayBlockingQueue fora de ordem, alguem sabe o motivo?
Muito obrigado,
Gustavo
