gpt4 book ai didi

java信号量习语

转载 作者:行者123 更新时间:2023-12-04 05:16:13 25 4
gpt4 key购买 nike

我有一个线程,它仅在获得对 2 个信号量的独占访问权限时才执行操作。

public void run(){
boolean a1=false;
boolean a2=false;
boolean a3=false;
while(true){
try{
if(res[1].tryAcquire()==true){
a1=true;
if((res[2].tryAcquire()==true){
a2=true;
if(res[3].tryAcquire()==true)){
a3=true;
System.out.println("Rolled the tobacco");
}
}
}
}
finally{
if(a1){
a1=false;
res[1].release();
}
if(a2){
a2=false;
res[2].release();
}
if(a3){
a3=false;
res[3].release();
}
}
}
}
}

有没有更好的方法来编写它以确保我们不会破坏信号量获取的计数?
有没有办法检查当前线程是否获取了信号量?

最佳答案

在 Java 7 中尝试使用 Closeable是可能的。当然必须有更好的解决方案。

public class Region implements Closeable {

private final Semaphore semaphore;

public Region(Semaphore semaphore) {
this.semaphore = semaphore;
if (!semaphore.tryAcquire()) {
throw NotAcquiredException(semaphore);
}
}

@Override
public void close() {
semaphore.release();
}
}

public class NotAcquiredException extends Exception { ... }

用法:
    public void run() {
boolean a1 = false;
boolean a2 = false;
boolean a3 = false;
while (true) {
try (Closeable r1 = new Region(res[1])) {
a1 = true;
try (Closeable r2 = new Region(res[2])) {
a2 = true;
try (Closeable r3 = new Region(res[3])) {
a3 = true;
System.out.println("Rolled the tobacco");
} catch (IOException e) {
}
} catch (IOException e) {
}
} catch (IOException e) {
}
}

关于java信号量习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com