首先,我认为这可能是我的设计存在的问题,并且我对应该搜索的术语缺乏了解。解决问题。
说我有3个线程(t1,t2,t3)。
这些线程访问一个线程,该线程以1个许可实现一个信号量(sem),并且是公平的(将FIFO给予排队的线程),一个线程实现一个计时器(定时器),该计时器每增加一个int(时间) 20毫秒
如果所有3个线程同时到达其代码中,并等待计时器增加6个单位,然后继续。
//In a thread t_ class
int timeInitial = timer.getTime();
while((timeInitial+6)>timer.getTime()) {
//Sleeps for 10ms to ensure it doesn't miss the timers 20ms
increments
try {
sleep(10);
}
catch (InterruptedException e) {
}
}
//Thread joins queue for the singular permit
sem.aquire();
//In the sem class
public void acquire() {
try {
semaphore.acquire();
}
catch (InterruptedException e) {
}
}
//In the timer class, timer functionality. Also has get and set method for time
@Override
public void run() {
while(processes > 0) {
try {
sleep(21);
time++;
}
catch (InterruptedException e) {
}
}
}
我想发生的事情是,如果多个线程尝试在同一计时器时间尝试以最低到最高(t1,t2,t3)的顺序获取许可。现在他们将以看似随机的顺序加入队列。
请注意,如果说t2和t3已在时间= 6排队等待许可,而t1在时间= 7到来,则它不会跳过队列,而只会与时间= 7的其他添加进行排队(t2, t3,t1)。
我在这里不必使用信号灯,这只是我对解决此问题的工具的最佳了解。
答案 0 :(得分:1)
我想您想让线程进入优先级队列,该队列将按到达时间排序,然后在时间相同时按优先级排序。线程将自己添加到此优先级队列后,将输入wait()。您将需要一种在适当的时间唤醒队列中所有线程的机制。醒来时,他们每个都会检查自己是否是队列的头-不是队列的头,然后返回到wait(),也就是将自己从队列中删除并去做自己的事情。也许合适的时间是每次选定的线程完成其工作或回到队列中?