- EDIT -
Я вижу, ваш код теперь помечен на Java; мой код больше похож на c # / pseudo, поэтому вам может потребоваться преобразовать его в Java.
- EDIT -
Хотя это может не помочь. Но я бы предложил более ориентированный на сущность подход; что-то вроде:
- Агенты, список агентов: список доступных агентов
- Клиенты, Очередь клиентов: Должны поддерживать очередь клиентов, нуждающихся в помощи
- CustomerSupport Manager:
- Будет ли агент доступен (не занят)
Dequeue
заказчик
- Назначьте его одному из доступных агентов
Над головой, см. Следующее:
Заказчик:
public class Customer
{
string _strName;
public Customer(string strName) { _strName = strName; }
}
Агент:
public class Agent
{
string _strName;
bool _bIsBusy = false;//
public bool IsBusy { get { return _bIsBusy; } }
Customer _Customer;
public Agent(string strName)
{
_strName = strName;
}
public void HandleCustomer(Customer theCustomer)
{
_Customer = theCustomer;
_bIsBusy = true;//Busy as long as the window is open.
//You might need something that doesnt block;
Thread.Sleep(5 * 1000); //Wait for time to simulate that agent is talking to customer
RemoveCustomer();//Done with the customer.
}
private void RemoveCustomer()
{
_Customer = null;
_bIsBusy = false;
}
}
менеджер:
Класс, который управляет клиентами и агентами, в зависимости от наличия
public class CustomerServiceBench
{
Queue<Customer> queCustomers = new Queue<Customer>();
List<Agent> lstAgents = new List<Agent>();
Thread thdService;
public CustomerServiceBench()
{
//Something along these lines.
thdService = new Thread(delegate() { WaitAndAddCustomerIfAgentIsAvailable(); });
}
private void AddCustomer()
{
//Add a dummy customer.
Random r = new Random(1231);
queCustomers.Enqueue(new Customer("Customer" + r.Next().ToString()));
Thread.Sleep(5 * 1000); //SpinWait.Once()...
}
private void WaitAndAddCustomerIfAgentIsAvailable()
{
//Thread1 to manage the
}
}