何时使用Thread,中断和加入

时间:2013-05-21 17:12:02

标签: java multithreading

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

如果客户线程正在进行剪发,并且有3个跟随线程在队列中,那么之后创建的其他客户线程必须停止,除非在3个等候室中有可用位置。

当第一个客户被削减时,第二个客户开始削减,所以2个线程在队列中,只有在这种情况下,还有一个线程可以加入等待。

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

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毫秒内没有完成,主线程也将变为可运行