我必须交替执行两个线程,其中一个线程必须比另一个执行N次。
public void init(int count) {
semaphore1 = new Semaphore(1);
semaphore2 = new Semaphore(0);
num=count;
}
class F1Thread extends Thread {
public void run() {
semaphore1.acquire();
for(int i=0;i<num;i++)
f1();
semaphore2.release();
}
class F2Thread extends Thread {
public void run() {
semaphore2.acquire();
f2();
semaphore1.release();
}
这是我的解决方案,但在此之前我尝试获取所有许可而不是1并进行循环
public void init(int count) {
semaphore1 = new Semaphore(count);
semaphore2 = new Semaphore(0);
num=count;
}
class F1Thread extends Thread {
public void run() {
semaphore1.acquire(count);
f1();
semaphore2.release();
}
class F2Thread extends Thread {
public void run() {
semaphore2.acquire();
f2();
semaphore1.release(count);
}
我的意思是
for(int i=0;i<number;i++)
semaphore.acquire();
和
semaphore.acquire(number);
不应该执行相同的操作吗?
答案 0 :(得分:0)
如果信号量有5个许可,
acquire()
将获得5并阻止。acquire(10)
会立即阻止,直到释放10张许可证。但是我没有在javadocs中找到这种行为,也没有在关注来源之后。
似乎贪婪的acquire(number)
可能意味着数量较少的其他线程总是首先传递。
不幸的是我没有找到规范。