Java多线程守护程序线程

时间:2018-02-06 13:14:42

标签: java multithreading concurrency daemon producer-consumer

我正在为一个大学课程的多线程应用程序工作。 这个场景是一些精灵正在制作礼物并将它们存放在共享缓冲区上,而其他精灵则会将这些物品运送到儿童身上。 该程序是一个工作日的模拟,我设法使用每隔几秒钟点击一次的时钟线程。 当时钟结束时,每个线程都应该完成。 但在我的场景中发生的是,一个线程或一组线程不允许JVM在完成main的执行后终止。我试过在堆栈溢出和谷歌上发现类似的问题。我也尝试使用弃用的函数Thread.stop()来找出导致问题的线程。 我得出的结论是,有问题的线程就是这个。

public void run() {
    while (!clock.isStopped()) {
        double fairChance;
        switch (turnTableID) {
            case 1:
                fairChance = Math.random();

                if (fairChance >= 0.5) {
                    //conveyor belt A Takes one of the two belts
                    BeltSemaphores(entryBuffer);
                } else {
                    BeltSemaphores(otherEntryBuffer);
                }
                break;
            case 2:
                //conveyor belt B
                fairChance = Math.random();
                if (fairChance >= 0.5) {
                    //conveyor belt B Takes one of the two belts
                    BeltSemaphores(entryBuffer);
                } else {
                    BeltSemaphores(otherEntryBuffer);
                }
                break;
            case 3:
                BeltSemaphores(entryBuffer);
                break;
            case 4:
                BeltSemaphores(entryBuffer);
                break;
        }

    }
}

public void BeltSemaphores(ConveyorBelt belt) {
    try {
        //BELT SEMAPHORES
        belt.full.acquire();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    try {
        belt.mutex.acquire();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }


    ///SACK SEMAPHORES
    if (sackOne != null && sackOne.SackID == belt.peek().getAgeGroup()) {
        SackSemaphores(sackOne, belt);
    } else if (sackTwo != null && sackTwo.SackID == belt.peek().getAgeGroup()) {
        SackSemaphores(sackTwo, belt);
    } else {
        try {
            exitBuffer.empty.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            exitBuffer.mutex.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Present a = belt.pop();
        exitBuffer.push(a);
        exitBuffer.mutex.release();
        exitBuffer.full.release();
    }

    //------------------
    belt.mutex.release();
    belt.empty.release();
}

public void SackSemaphores(Sack sack, ConveyorBelt belt) {
    try {
        sack.empty.acquire();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    try {
        sack.mutex.acquire();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    sack.addToSack(consume(belt));

    sack.mutex.release();
    sack.full.release();
}

}

你知道是什么原因引起了我的问题吗?所有其他线程共享while(!clock.isStopped())函数并正常终止。

0 个答案:

没有答案