0

我有一家商店有很多队列。每个队列都有许多可以等待服务的最大客户端,我可以写队列的数量。我的商店必须在我给定的几分钟后关闭。问题是它没有。它只是生成服务的客户并生成等等等等。

import java.util.List;
import java.util.Timer;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        //long startTime = System.currentTimeMillis();
                long endTime;
                int nrCozi;
                int nrClientiMax;

                System.out.println("Introduceti cate minute va fi deschis magazinul: ");
                Scanner in = new Scanner(System.in);
                endTime = in.nextInt();
        endTime = System.currentTimeMillis() + endTime * 1000 * 60;

                System.out.println("Introduceti numarul de cozi: ");
                nrCozi = in.nextInt();

                System.out.println("Introduceti numarul maxim de clienti per coada: ");
                nrClientiMax = in.nextInt();
                System.out.println("clienti" + nrClientiMax);

        List<Coada> cozi = CoadaUtil.create(nrCozi, endTime);
        CoadaUtil.startCozi(cozi);

        Timer timer = new Timer();
        timer.schedule(new ClientGenerator(nrClientiMax, cozi), 0, (int) (Math.random()* 10 * 1000));


    }

}

这是队列类

import java.util.ArrayList;
import java.util.List;

public class Coada implements Runnable {

    private List<Client> clients;
    private long closingTime;
        private long sleepTime = 0;
    private String nume;

    public Coada(long closingTime) {
        clients = new ArrayList<Client>();
        this.closingTime = closingTime;
    }

    public void setNume(String nume) {
        this.nume = nume;
    }

    public void addClient(Client c) {
        clients.add(c);
    }

    private Client pop() {
        if (clients.size() > 0) {
            Client c = clients.get(0);
            clients.remove(0);
            return c;
        }
        return null;
    }

    @Override
    public void run() {
        Client c = this.pop();
        long currentTime = System.currentTimeMillis();
        while (c != null || currentTime < closingTime) {
            if (c != null) {    
                            try {
                    System.out.println("Sunt coada " + this.nume + " si " +
                            "tratez clientul " + c.getNume());
                    Thread.sleep(c.getWaitingTime() * 1000);
                } catch (InterruptedException e) {
                }
            }
            currentTime = System.currentTimeMillis();
            c = this.pop();
         if(c==null){
                     this.sleepTime+=System.currentTimeMillis() - currentTime;
                     this.sleepTime++;
                }
                }
               // System.out.println("Coada " + this.nume +" a dormit " + this.sleepTime );

    }

    public int getClientSize() {
        return clients.size();
    }

    public String getNume() {
        return this.nume;
    }

        public long getSleepTime(){
            return this.sleepTime;
        }


}

客户端生成器类

import java.util.List;
import java.util.TimerTask;


public class ClientGenerator extends TimerTask {

    private int nrClients;

    private List<Coada> cozi;

    public ClientGenerator(int i, List<Coada> cozi) {
        this.nrClients = i;
        this.cozi = cozi;
    }

    @Override
    public void run() {
        for (int i = 0; i < nrClients; i++) {
                        System.out.println("!!!!!!!!!!!!!Client" + i +" din " + nrClients);
            Client client = new Client((int) (Math.random() * 10), i + ""); // timp random
                        System.out.println("Clientul " + client.getNume() + " asteapta " + client.getWaitingTime()*10 + " secunde");

                        Coada coada = CoadaUtil.gasesteCoadaOptima(cozi);
            coada.addClient(client);
            System.out.println("Am adaugat clientul " + i + " la" +
                    " coada " + coada.getNume());
        }

    }

}

CoadaUtil 类

import java.util.ArrayList;
import java.util.List;


public class CoadaUtil {

    private CoadaUtil(){}

    public static List<Coada> create(int nrCozi, long endTime) {
        List<Coada> cozi = new ArrayList<Coada>();
        for (int i = 0; i < nrCozi; i++) {
            Coada c = new Coada(endTime);
            c.setNume(i + "");
            cozi.add(c);
        }
        return cozi;
    }

    public static void startCozi(List<Coada> cozi) {
        for (int i = 0; i < cozi.size(); i++) {
            Thread t = new Thread(cozi.get(i));
            t.start();
        }
    }

    public static Coada gasesteCoadaOptima(List<Coada> cozi) {
        Coada c = cozi.get(0);
        for (Coada coada : cozi) {
            if (coada.getClientSize() < c.getClientSize()) {
                c = coada;
            }
        }
        return c;
    }

}

我的猜测是它与 System.currentTimeMillis(); 从主班。

谢谢, 德拉戈斯

4

1 回答 1

1

该程序并没有停止,因为您Timer在处理它们的线程完成很久之后就永远生成客户端。

Coada在处理线程(对象)完成后退出程序的一种简单方法是创建Timer一个守护线程:

Timer timer = new Timer(true);

当只有守护线程正在运行时,JVM 将退出。

来自Timer的java文档:

在对 Timer 对象的最后一个实时引用消失并且所有未完成的任务都已完成执行后,计时器的任务执行线程优雅地终止(并成为垃圾回收的对象)。但是,这可能需要任意长的时间才能发生。默认情况下,任务执行线程不作为守护线程运行,因此它能够防止应用程序终止。

于 2013-03-27T21:39:43.643 回答