1

我正在做一个睡觉的理发师。所以,首先我创建了 10 个客户线程,彼此之间有 2 秒的“睡眠”。现在,第一个客户剪头发,意味着睡 5 秒。我们有等待空间来跟踪线程,而我们只有 3 个线程。

如果一个客户线程正在剪头发,并且有 3 个后续线程在队列中,则此后创建的其他客户线程必须停止,除非在 3 个等候室中有可用位置。

当第一个客户被切掉时,第二个客户开始切入,因此有 2 个线程在队列中,只有在这种情况下,才有一个线程可以加入等待。

要完成所有这些任务,有人可以简短地告诉我,在哪里使用睡眠、中断和加入。特别是如何让线程等待其他线程完成,以及如何检测当前有多少线程正在等待/休眠?

4

2 回答 2

1

您可以使用附加信号量,其中 3 个位置用于候诊室,一个二进制信号量用于理发师。

Semaphore waitingRoom = new Semaphore(3);
Semaphore barber= new Semaphore(1);

方法 cut 应该是这样的:

waitingRoom.acquire();

barber.acquire();
waitingRoom.release()

Thread.sleep(300)

barber.release()

.join()仅当您等待线程继续您的程序时才使用。你不需要中断这个线程,它必须完成他的run().

.interrupt()将保持线程。

于 2013-05-21T17:22:21.537 回答
1

sleep() 方法将线程的执行延迟指定的时间段。在睡眠时,线程不会释放它的锁。它仍然持有它。

如果一个线程在另一个线程上调用join方法,则意味着该线程只有在另一个线程完成运行后才能运行。例如

public static void main(String[] args){
    Thread thread1 = new Thread();
    thread1.join();
}

上面的代码意味着在thread1完成运行后主线程将变为可运行。如果您使用重载版本的连接方法。

thread1.join(100)

这意味着要等待 100 毫秒,让 thread1 完成,但如果这没有发生,任何人都可以运行。所以即使 thread1 没有在 100 毫秒内完成,主线程也会变得可运行

于 2013-05-21T17:38:57.657 回答