如何使用多线程更新GUI的多个部分?

时间:2019-03-31 20:57:53

标签: java multithreading

我有一个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

0 个答案:

没有答案