我有给定随机数(1到n)的线程并被指示按排序顺序打印它们。我使用了信号量,以便获得许可证数量=随机数,并获得比获得的更多的许可证。Java - 没有获取信号量版本
获得=随机数;释放= 1 +随机数
信号量的初始许可证计数为1.因此,随机数1的线程应该获得许可证,然后是2等等。
这是支持按以下
给出的文件有()的释放许可线程必须通过调用获取已获得该许可证没有要求。
问题是我的程序在n> 2后卡住了1。
我的程序如下:
import java.util.concurrent.Semaphore;
public class MultiThreading {
public static void main(String[] args) {
Semaphore sem = new Semaphore(1,false);
for(int i=5;i>=1;i--)
new MyThread(i, sem);
}
}
class MyThread implements Runnable {
int var;Semaphore sem;
public MyThread(int a, Semaphore s) {
var =a;sem=s;
new Thread(this).start();
}
@Override
public void run() {
System.out.println("Acquiring lock -- "+var);
try {
sem.acquire(var);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(var);
System.out.println("Releasing lock -- "+var);
sem.release(var+1);
}
}
输出是:
获取锁 - 4
获取锁 - 5
获取锁 - 3
获取锁 - 2
获取锁定 - 1
释放锁 - 1
虽然如果我用tryAcquire修改我的代码,它运行得非常好。 下面是新的运行实施
@Override
public void run() {
boolean acquired = false;
while(!acquired) {
acquired = sem.tryAcquire(var);
}
System.out.println(var);
sem.release(var+1);
}
有人可以解释信号灯的许可证的获取机制,当多张线程与不同的许可请求等待?
我很抱歉,我不能回答你的问题,但。不**在构造函数中执行'new Thread(this).start();'。由于您仍在构造函数中,因此对象不完整,您将部分初始化的对象提供给另一个方法,在这种情况下甚至会传送给另一个线程。这真的很糟糕,不要这样做。更好'扩展线程'而不是'实现Runnable',然后执行'new MyThread(i,sem).start();'或执行'new Thread(new MyThread(i,sem))。start();'。 – Vampire
噢,我会验证这一点。感谢您指出。 – user1474053
@BjörnKautler而不是仅仅说“*这真的很糟糕,不要这样做*。”试图解释*为什么*所以人们可以理解潜在的问题。 – dimo414