如何使用信号量在特定点停止和启动所有线程? java
How to stop and start all threads at a certain point with semaphores? java
正在尝试用信号量替换监视器。这个想法是等待线程直到它们都达到这个函数。
这里是监视器:
public void checkThreadsAreToChangeColor() {
synchronized (lock) {
while (waitingThreads <= 1) { // Threads are going
waitingThreads++;
try {
System.out.println(this.id + " sleeping");
lock.wait();
return;
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
lock.notifyAll(); // Last thread to change color
waitingThreads = 0;
limit = 99999999;
startTimeOnType = System.currentTimeMillis();;
}
}
有关更多详细信息,如果有帮助,总是有 3 个线程。
使用 pveentjer 的代码我设法解决了我的问题。
我建议使用 CyclicBarrier。
因此,对于信号量,您将在计数器达到零后等待。
使用 CyclicBarrier 时,一组线程等待组中的最后一个线程完成。
因此,CyclicBarrier 是更适合您问题的解决方案。
[edit] 我已经更新了我的答案,因为我误解了这个问题。不是一个线程等待一堆线程到达一个公共点,而是一组线程需要等待每个线程到达这个公共点。
[edit2] 我添加了一个基于信号量的 CyclicBarrier 实现。
class CyclicBarrier{
private final Semaphore mutex = new Semaphore(1);
private final Semaphore waiters = new Semaphore();
private final int parties;
private int completed_parties;
public CyclicBarrier(int parties){
this.parties = parties;
}
public void await() throws InterruptedException {
boolean last_party = false;
mutex.acquire();
try{
completed_parties++;
if (completed_parties == parties){
last_party = true;
}
}finally{
mutex.release();
}
if(last_party){
waiters.release(parties);
}
waiters.acquire();
}
}
正在尝试用信号量替换监视器。这个想法是等待线程直到它们都达到这个函数。
这里是监视器:
public void checkThreadsAreToChangeColor() {
synchronized (lock) {
while (waitingThreads <= 1) { // Threads are going
waitingThreads++;
try {
System.out.println(this.id + " sleeping");
lock.wait();
return;
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
lock.notifyAll(); // Last thread to change color
waitingThreads = 0;
limit = 99999999;
startTimeOnType = System.currentTimeMillis();;
}
}
有关更多详细信息,如果有帮助,总是有 3 个线程。
使用 pveentjer 的代码我设法解决了我的问题。
我建议使用 CyclicBarrier。
因此,对于信号量,您将在计数器达到零后等待。
使用 CyclicBarrier 时,一组线程等待组中的最后一个线程完成。
因此,CyclicBarrier 是更适合您问题的解决方案。
[edit] 我已经更新了我的答案,因为我误解了这个问题。不是一个线程等待一堆线程到达一个公共点,而是一组线程需要等待每个线程到达这个公共点。
[edit2] 我添加了一个基于信号量的 CyclicBarrier 实现。
class CyclicBarrier{
private final Semaphore mutex = new Semaphore(1);
private final Semaphore waiters = new Semaphore();
private final int parties;
private int completed_parties;
public CyclicBarrier(int parties){
this.parties = parties;
}
public void await() throws InterruptedException {
boolean last_party = false;
mutex.acquire();
try{
completed_parties++;
if (completed_parties == parties){
last_party = true;
}
}finally{
mutex.release();
}
if(last_party){
waiters.release(parties);
}
waiters.acquire();
}
}