【发布时间】:2016-05-19 15:42:55
【问题描述】:
我需要优先构建我称之为“不公平信号量”的东西。
例如:当一个priority = 1的线程想要获取信号量时,它只需要等到另一个具有相同优先级的线程完成后,它就可以acquire()。但是当一个priority = 2的线程想要获取信号量时,它必须等待所有priority = 1的线程完成后才能使用信号量,然后再尝试acquire()。
我总共有 4 个不同的优先级。
这是我尝试过的方法,但没有成功。
有人有解决办法吗?
public class UnfairSemaphore
{
private Semaphore mPrior1;
private Semaphore mPrior2;
private Semaphore mPrior3;
private Semaphore mPrior4;
public UnfairSemaphore()
{
mPrior1 = new Semaphore(1);
mPrior2 = new Semaphore(1);
mPrior3 = new Semaphore(1);
mPrior4 = new Semaphore(1);
}
public void acquire(int priority) throws InterruptedException
{
if(priority == 1)
{
mPrior1.acquire();
}
else if(priority == 2)
{
while(mPrior1.hasQueuedThreads() && mPrior1.availablePermits() <=0)
{
//wait();
}
mPrior2.acquire();
mPrior1.acquire();
}
else if(priority == 3)
{
while(mPrior1.hasQueuedThreads() && mPrior1.availablePermits() <=0 && mPrior2.hasQueuedThreads() && mPrior2.availablePermits() <=0)
{
//wait();
}
mPrior3.acquire();
mPrior2.acquire();
mPrior1.acquire();
}
else
{
while(mPrior1.hasQueuedThreads() && mPrior1.availablePermits() <=0 && mPrior2.hasQueuedThreads() && mPrior2.availablePermits() <=0 && mPrior3.hasQueuedThreads() && mPrior3.availablePermits() <=0)
{
//wait();
}
mPrior4.acquire();
mPrior3.acquire();
mPrior2.acquire();
mPrior1.acquire();
}
}
public void release(int priority)
{
if(priority == 1)
{
mPrior1.release();
}
else if(priority == 2)
{
mPrior1.release();
mPrior2.release();
}
else if(priority == 3)
{
mPrior1.release();
mPrior2.release();
mPrior3.release();
}
else
{
mPrior1.release();
mPrior2.release();
mPrior3.release();
mPrior4.release();
}
//notifyAll();
}
}
【问题讨论】:
-
“但它没有用”它做了什么?
标签: java multithreading mutex semaphore