Java 挂环主线

Java 挂环主线,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我在一个池线程和主线程中使用同步。在池线程中,我使用synchronizationlocker锁定部分,然后执行: synchronization(locker){ QueuePool.shutdownNow(); while(!QueuePool.isShutDown()){} //do something after QueuePool.SetThreadQueue(null); QueuePool queue = QueuePool.GetThread

我在一个池线程和主线程中使用同步。在池线程中,我使用synchronizationlocker锁定部分,然后执行:

synchronization(locker){
   QueuePool.shutdownNow();
   while(!QueuePool.isShutDown()){}
   //do something after

    QueuePool.SetThreadQueue(null);

    QueuePool queue = QueuePool.GetThreadQueue();

    Pallets pallets = Pallets.GetPallets(context);

    ////////////////////////////////////////////////////////////////////////////////////
    for (String key : pallets.getPalletsToSend().keySet()) {
        for (HashMap<String, String> object : pallets.getPalletsToSend().get(key)) {
            PalletSender sender = new PalletSender(object, context);
            queue.addTask(sender);
        }
    }
}
QueuePool是具有ThreadPoolExecution的单例。在SetThreadQqueue中,我清除了null上的singleton实例


池线程每2分钟运行一次。它有可能首先进入池线程。因此,等待一段时间可能需要多长时间!你是不是停下来了?也许我可以添加一些代码,在循环中再添加一个条件?我不确定我是对的。让我知道什么是最好的。

你应该复制整个代码,像这样写下的问题不容易理解,你可以使用。。。此外,不要使用循环,请记住,在您调用shutdownNow之后,池将无法完成提交的任务,也不会接受新任务。您当前的代码肯定不好,原因有两个。第一,你有一个紧密的自旋循环,在等待事情发生时会烧坏CPU。当你需要一些事情发生时,你不想烧掉CPU,因为你需要消耗发生事情所需的资源。第二,你拿着锁等着。这会导致各种各样的问题,包括经常出现的死锁。@DavidSchwartz那么我该怎么办?@PatrykImosa移除锁,使用一种不忙等待的方法,即等待终止。你确定你需要等待终止吗?
synchronized (QueuePool.locker2){QueuePool.GetThreadQueue().addTask(palletSender);}