如果客户线程正在进行剪发,并且有3个跟随线程在队列中,那么之后创建的其他客户线程必须停止,除非在3个等候室中有可用位置。
当第一个客户被削减时,第二个客户开始削减,所以2个线程在队列中,只有在这种情况下,还有一个线程可以加入等待。
要完成所有这些任务,有人可以简单地告诉我,在哪里使用睡眠,中断和加入。特别是如何让线程等待其他人完成,以及如何检测当前正在等待/休眠的线程数?
答案 0 :(得分:1)
您可以使用additiv semaphores为候诊室提供3个位置,为理发用户提供一个二进制信号量。
Semaphore waitingRoom = new Semaphore(3);
Semaphore barber= new Semaphore(1);
切割的方法应该是这样的:
waitingRoom.acquire();
barber.acquire();
waitingRoom.release()
Thread.sleep(300)
barber.release()
只有在等待线程继续运行程序时才使用.join()
。您不需要中断此线程,它必须完成他的run()
。
.interrupt()
将保留该主题。
答案 1 :(得分:0)
sleep()方法按指定的时间段延迟执行线程。在睡觉时,线程不会释放其锁定。它仍然坚持下去。
如果一个线程在另一个线程上调用join方法,那么这意味着该线程只有在另一个线程完成运行后才能运行。 e.g。
public static void main(String[] args){
Thread thread1 = new Thread();
thread1.join();
}
上面的代码表示在thread1完成运行后主线程将变为可运行。 如果使用重载版本的join方法。
thread1.join(100)
这意味着等待100毫秒才能完成thread1,但如果没有发生,那么任何人都可以运行。因此即使thread1在100毫秒内没有完成,主线程也将变为可运行