在多个线程同时尝试获取信号灯许可时设置优先级

时间:2018-10-31 05:37:01

标签: java multithreading concurrency

首先,我认为这可能是我的设计存在的问题,并且我对应该搜索的术语缺乏了解。解决问题。


说我有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)。


我在这里不必使用信号灯,这只是我对解决此问题的工具的最佳了解。

1 个答案:

答案 0 :(得分:1)

我想您想让线程进入优先级队列,该队列将按到达时间排序,然后在时间相同时按优先级排序。线程将自己添加到此优先级队列后,将输入wait()。您将需要一种在适当的时间唤醒队列中所有线程的机制。醒来时,他们每个都会检查自己是否是队列的头-不是队列的头,然后返回到wait(),也就是将自己从队列中删除并去做自己的事情。也许合适的时间是每次选定的线程完成其工作或回到队列中?