Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 柜台忙着等待_Java_Multithreading_Concurrency_Java.util.concurrent - Fatal编程技术网

Java 柜台忙着等待

Java 柜台忙着等待,java,multithreading,concurrency,java.util.concurrent,Java,Multithreading,Concurrency,Java.util.concurrent,要实现异步FileChannel的优雅终止,我必须等待所有提交的任务完成执行,然后再调用其close方法。 我不能关闭并等待底层执行器的终止,因为Javadoc中概述了关闭方法的要求 因此,我试着做以下几点,只是我不知道如何正确地实现它 线程1、3、4 线程2 由执行者服务管理 // Task completed counter.decrement(); 线程1 将来某个时候 while (!counter.isZero()) { // Wait } // Proceed 如果可能,

要实现异步FileChannel的优雅终止,我必须等待所有提交的任务完成执行,然后再调用其close方法。 我不能关闭并等待底层执行器的终止,因为Javadoc中概述了关闭方法的要求

因此,我试着做以下几点,只是我不知道如何正确地实现它

线程1、3、4

线程2 由执行者服务管理

// Task completed
counter.decrement();
线程1 将来某个时候

while (!counter.isZero()) {
    // Wait
}
// Proceed
如果可能,应接受等待时到达的任务。应该放弃后续任务,可能会触发某些逻辑

将未来放在BlockingQueue中会有点过分,因为在这种情况下,计算排队加上正在运行的任务就足够了


我应该使用java.util.concurrent包中的哪个类?

我没有研究您关于close方法的断言,但是您可以使用信号量创建一种按需锁定的网关:

final Semaphore gate = new Semaphore(Integer.MAX_VALUE);

void submit() {
    if (gate.tryAcquire()) {
        try {
            // submit
        } finally {
            gate.release();
        }
    }
}

void shutdown() throws InterruptedException {
    gate.acquire(Integer.MAX_VALUE);
    // shutdown
}

为什么你不能关闭遗嘱执行人?Javadoc中概述的关闭方法要求是什么?@ErwinBolwidt调用关闭方法后,执行器将关闭,但是在调用close方法之前必须处理所有挂起的任务。为什么不在关闭executor后关闭它?@ErwinBolwidt,因为在通道打开时关闭executor服务会导致未指定的行为。实际上,我不确定尝试一次获取所有许可证是否是一个好主意。你可能需要公平地防止饥饿。或者在循环中获取许可,直到什么?。或者考虑一个Read WrreBooCK。我认为Access Primig.Max值会逐步增加,也就是说,尝试获取每个许可证。但看看代码,要么全是,要么什么都不是。这意味着如果有大量并发流量,它可能永远不会成功。在模式中创建信号量可能会阻止这种情况的发生。实际上,我不确定它是全部还是全部。代码有点深奥。
final Semaphore gate = new Semaphore(Integer.MAX_VALUE);

void submit() {
    if (gate.tryAcquire()) {
        try {
            // submit
        } finally {
            gate.release();
        }
    }
}

void shutdown() throws InterruptedException {
    gate.acquire(Integer.MAX_VALUE);
    // shutdown
}