【问题标题】:Java Semaphore Stop ThreadsJava 信号量停止线程
【发布时间】:2015-09-30 07:25:55
【问题描述】:

大家下午好,

我正在为一个学校项目使用 Java 的信号量和并发,并且对它的工作原理有一些疑问!

如果没有可用的许可,我需要线程退出“队列”——而不仅仅是在准备好之前休眠。这可能吗?正如您在我的try, catch, finally 中看到的那样 - 此事件没有句柄:

try {
    semaphore.acquire();
    System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString());
    Thread.sleep(3000);
}
catch (InterruptedException e) {
   e.printStackTrace();
} finally {   
   semaphore.release();
   System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString());
}

Daniel 提出了tryAquire 函数 - 这看起来很棒,但我读过的教程指出信号量需要一个try, catch, finally 块来防止死锁。我当前的代码(实现tryAquire)将在finally 块中发布,即使该线程从未被获取。你有什么建议吗?

public void seatCustomer(int numBurritos) {
    try {
        if(semaphore.tryAcquire()) {
            System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString());
            Thread.sleep(3000); 
        } else {
            System.out.println(Thread.currentThread().getName() + " left due to full shop");
        }

    }
    catch (InterruptedException e) {
       e.printStackTrace();
    } finally {   
       semaphore.release();
       System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString());
    }
}

【问题讨论】:

    标签: java multithreading concurrency semaphore


    【解决方案1】:

    我建议您阅读Semaphor 的JavaDocs。特别是看看 tryAcquire 方法。

    仅当调用时可用时,才从此信号量获取许可。

    获取一个许可,如果一个可用并立即返回,值为 true,将可用许可的数量减少一个。

    如果没有可用的许可,则此方法将立即返回值为 false。

    这意味着您可以尝试获得许可(如果有的话)。如果没有可用,则此方法立即返回 false 而不是阻塞。

    你必须让你的“finally”块更聪明一点。

    boolean hasPermit = false;
    try {
        hasPermit = semaphore.tryAcquire();
        if (hasPermit) {
            // do stuff.
        }
    } finally {
        if (hasPermit) {
           semaphore.release();
        }
    }
    

    【讨论】:

    • 谢谢丹尼尔!这就是我一直在玩的东西,但是我的 try/catch/finally 阻止了从未获得的释放线程 =/
    • 我已经更新了我的答案,包括如何在你的 finally 块中处理它。
    • 这就是票——非常感谢您的所有帮助@Daniel
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多