我有一个Java仿真,其中我必须不断更新时钟,客户端到达队列,而客户端从队列离开。我无法正确同步它们。我必须使用线程和可运行对象。
为了同步我的GUI,我尝试了以下操作:我创建了一个主线程,该线程根据其他线程(时钟,客户端到达线程,队列服务线程-每个队列都有自己的线程)刷新GUI。
在到达控制线程中,我创建了一个客户端。此后,它将在当前客户端的到达时间进入休眠状态。 (以模拟客户端之间的“到达时间”。
主线程接收客户端并将其添加到随机队列线程中,并在textArea中写入日志。
在队列线程中,客户端在“服务时间”后被删除。 (为模拟这一点,队列线程休眠“服务时间”秒)。
主线程更新GUI,并在textArea中写入日志。
到达线程:
public void run() {
while(clock.isRunning()) {
Client cClient = new Client(getRandomArrival(), getRandomServing());
setCurrentClient(cClient);
try {
Thread.sleep(cClient.getArrivalTime() * clock.getDelay());
} catch (InterruptedException e) {
e.printStackTrace();
}
int queueToInsert = getRandomQueue();
setCurrentQueue(queueToInsert);
}
}
QueueLogic线程:
public void run() {
while(clock.isRunning()) {
Client c;
while((c = getFirstClient()) == null) {
validClient = false;
}
validClient = true;
try {
Thread.sleep(c.getServingTime() * clock.getDelay());
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Client got out!");
}
}
主线程:
public void run() {
while(clock.isRunning()) {
view.setClockText(clock.toString());
if(!arrivalThread.getState().equals(Thread.State.TIMED_WAITING) && arrivalControler.getCurrentClient() != null) {
cashRegisters.get(arrivalControler.getCurrentQueue()).addInQueue(arrivalControler.getCurrentClient());
view.appendLog("Client added to queue: " + arrivalControler.getCurrentQueue()
+ " - " + clock.toString());
view.appendLog(cashRegisters.toString());
drawer.addClientToCashRegister(arrivalControler.getCurrentQueue());
}
for(int i = 0; i < view.getNrCozi(); i++) {
//System.out.println(crThreads.get(i).getState() + " " + i);
if(cashRegisters.get(i).isValid() && !crThreads.get(i).getState().equals(Thread.State.TIMED_WAITING)) {
view.appendLog("Client left queue: " + i + " - " + clock.toString());
drawer.removeClientFromCashRegister(i);
view.appendLog(cashRegisters.toString());
}
}
}
}
时钟线程:
public void run() {
while(isRunning()) {
increment();
try {
Thread.sleep(delay);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
System.out.println("I am in the clock!");
}
在下图中,每秒都有一个新客户端到达。在2秒钟内为客户提供服务。有4个队列,每个人都应该足够快地离开。但是,如图所示,加入队列3的客户端从未退出。 图片链接:https://i.imgur.com/vHHwDLt.jpg