多线程JAVA期间内存不足错误或程序无响应

时间:2014-05-29 23:11:00

标签: java multithreading

我是多线程新手。从字面上看。而且我对Java整体都很陌生。 HOwever,我正在进行模拟并且线程似乎运行良好,除非我偶尔让程序变得反应迟钝并且一旦它说出内存错误。我认为这是因为我创建了太多线程?在通常这样做的时候,我有超过2000个线程在同一时间运行。我可以调整代码(即减少客户数量或增加时间间隔)以释放系统压力,但我想知道是否有一些我可以做的事情来帮助减轻每个线程本身的负担。我很确定它不是死锁,因为如果我执行上述操作,代码运行正常,但运行时间更长,因此相同数量的客户都会通过。我将展示代码的相关部分,如果需要更多,我很乐意提出这个问题。请不要理解这一点,所以非常感谢一些非常简单和有用的解释,因为如果评论太复杂,我可能不会'知道如何实现它。

这是创建线程的主类。

    CheckoutFloor checkoutFloor = new CheckoutFloor();
    checkoutFloor.addCheckoutOperators(checkoutOperators);
    int tick = 0;
    int customers = 0;

    while (tick < simulationTime) {

        for (int i = 0; i < 2; i++) {
            Random rand = new Random();
            int random = rand.nextInt(100) + 1;
            if (random <= 50) {
                customerRunnable customer = new customerRunnable(checkoutFloor);
                Thread t = new Thread(customer);
                t.start();
                tick++;
            }
            else {
                tick++;
            } 

这是可运行的代码:

 public void run() {
    try {
        customer.addRandomShopTime();
        while (customer.shopTime > 0) {
            Thread.sleep(1);
            customer.setShopTime();
        }
        CheckoutOperator checkoutOperator = checkoutFloor.weightedCheckoutDeterminator();
        checkoutOperator.addCustomer(customer);

        while (customer.checkoutTime > 0) {
            Thread.sleep(1);
            if (checkoutOperator.customerList.get(0) == customer) {
                customer.setCheckoutTime();
            }
        }
        checkoutOperator.removeCurrentCustomer();

    } catch (InterruptedException e) {

    }

以下是相关方法。

public synchronized void addCustomer(Customer newCustomer) {
        customerList.add(newCustomer);
        System.out.println("no. of customers" + counter);
        counter++;
}


public synchronized CheckoutOperator weightedCheckoutDeterminator() {
    int totalCustomers = 0;
    int totalCustomersAdj = 0;
    for (int i = 0; i < checkoutOpList.size(); i++) {
        totalCustomers += getCheckoutOperator(i).getCustomerListLength();
    }
    if (totalCustomers == 0) {
        return getCheckoutOperator(0);
    } else {
        totalCustomersAdj = (checkoutOpList.size() * totalCustomers) - totalCustomers;
        int randomNumber = 0;
        try {
            randomNumber = new Random().nextInt(totalCustomersAdj) + 1;
        } catch (IllegalArgumentException ex) {
            return checkoutOpList.get(0);
        }

        for (int i = 0; i < checkoutOpList.size(); i++) {
            int operatorCustLength = (getCheckoutOperator(i).getCustomerListLength());

            if (randomNumber <= (totalCustomers - operatorCustLength)) {
                return getCheckoutOperator(i);

            } else {
                randomNumber = randomNumber - (totalCustomers - operatorCustLength);
            }
        }
        return checkoutOpList.get(0); //HOPEFULLY UNREACHABLE!!!

    }

我只是想知道,由于我缺乏知识,是否有任何我想念的东西,woudl会帮助流程更多并帮助它更快地运行?

[编辑:我应该补充说,在正常情况下,我永远不会运行2000个线程,这是我推动系统达到最大值。我怀疑这是问题所在,我想我在问我是否因为缺乏知识而缺少其他东西。我只是不喜欢这样的想法:如果有人更改代码以使其更加密集​​以至于可能会崩溃。

0 个答案:

没有答案