我无法弄清楚这个问题。在多线程环境中 - 正好3个线程应该能够执行同步块并且休息应该等待吗?
我理解的是当我们使用同步或监视器时,一个线程将等到另一个线程在侧面同步块或方法中完成其执行。要实现多个线程进入同步块或方法内部,我们需要使用wait(),notify(),notifyAll()即线程间通信,其中wait()方法在调用某个对象时会占用其锁定并给予机会其他等待的线程。
所以,我想知道如何做上述问题。我不确定我是否以正确的方式提出了我的问题。如果可能,我们需要使用java concurrent util包,或者可以在基本(核心)线程功能中完成。
答案 0 :(得分:5)
使用具有三个许可证的信号量:
信号量通常用于限制可以的线程数 访问一些(物理或逻辑)资源。
答案 1 :(得分:1)
使用信号量可能是解决问题的最佳方案,但尝试自己的解决方案并不会有什么坏处,即使它只是为了试验和学习新的东西。 / p>
以下是使用LinkedBlockingQueue
的锁实现的快速示例。此锁只允许一定数量的线程访问getKey()
和returnKey()
之间的代码块:
public class Lock {
private int keys;
private LinkedBlockingQueue<Integer> q;
public Lock(int keys) throws InterruptedException {
q = new LinkedBlockingQueue<>();
while (q.size() != keys)
q.put(0);
}
public void getKey() throws InterruptedException {
q.take();
}
public void returnKey() throws InterruptedException {
q.put(0);
}
static Lock lck;
public static void main (String [] args) throws InterruptedException {
lck = new Lock(3);
Runnable r = new Runnable() {
@Override
public void run() {
try {
lck.getKey();
Lock.test();
lck.returnKey();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
for (int t = 0; t < 10; t ++)
new Thread(r).start();
}
public static void test() throws InterruptedException {
System.out.println("I am " + Thread.currentThread().getName());
Thread.sleep(1000);
}
}