我目前正在参加“高级”(按照我们大学的CS课程标准)程序员的Java入门课程。虽然到目前为止我们所使用的概念都没有根本不同,但我对Semaphores的实用性感到困惑 - 我应该使用一个(或多个?)信号量来确保只有五个线程执行在任何给定时间的序列。因为我在哪里,我无法测试我的程序是否正朝着正确的方向前进,但我只需要弄清楚Semaphore.acquire()是如何工作的:
由于“acquire()”是信号量的方法,并且它不以线程(或任何东西)作为参数,你如何“选择”一个线程来获取许可证?它会自动将许可证应用于之前引用的线程吗?这基本上就是我现在要做的事情:
Thread selected = threads[int next_thread_to_add];
mySemaphore.acquire();
答案 0 :(得分:1)
有一个简单的Semaphore
样本。通过使用Semaphore
,您可以传递Semaphore
对象来确定可以运行多少个线程。
public class Test implements Runnable {
Semaphore semaphore;
public Test(Semaphore semaphore) {
this.semaphore = semaphore;
}
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(1);
Thread thread1 = new Thread(new Test(semaphore));
Thread thread2 = new Thread(new Test(semaphore));
Thread thread3 = new Thread(new Test(semaphore));
Thread thread4 = new Thread(new Test(semaphore));
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("Hello World: " + Thread.currentThread().getName());
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:0)
调用mySemaphoer.acquire()的当前运行的线程获取许可。你不选择线程,信号量,选择'线程只是通过acquire()调用前进。其他人等到他们被选中'
答案 2 :(得分:0)
因为" acquire()"是信号量的方法,并没有把一个线程(或任何东西)作为一个参数,你如何选择"获得许可的线索?
您需要先使用信号量的.aquire()
方法执行同步的代码块。在同步代码块的末尾,使用.release()
方法,以便其他线程可以获取信号量。
它会自动将许可证应用于之前引用的线程吗?
不,无论运行什么线程,都会在信号量到达mySemaphore.acquire();
行时尝试从信号量中获取()许可。
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquire()
与使用信号量或锁定时的情况一样 - 小心避免使用deadlock。