线程间通信:Condition
对于线程间通信,大家最熟悉的莫过于Object.wait()、Object.notify()了。Condition的使用与前面的方法类似。
- await():当前线程调用后,释放锁资源,进入等待状态;当其他线程调用signal()或者signalAll()时,线程会重新获得锁并继续执行。
- awaitUninterruptibly():与await()方法的唯一区别就是,不响应中断信号。(await是响应中断的)
- signal():唤醒一个等待中的线程,类似于Object.notify(),signalAll()则是唤醒所有等待中的线程,然后让其竞争执行。
上述示例代码可以看出,在t1执行的过程中,调用了await(),然后主线程中调用了signal(),让其继续执行。
信号量:Semaphore
信号量这个名字乍一看来和线程同步控制没有任何关系,但是信号量的功能比ReentrantLock还要强大。当我们new ReentrantLock()的时候,此时我们就有了一把锁,而信号量则是可以自己定义这个锁的个数。
Semaphore类提供了一下两个构造方法:
从构造方法可以看出,创建有容量的锁对象,同时还可以让其公平。其常用方法如下:
下面展示一个简单的例子:
上面代码创建了容量为5的锁,故每次打印的"done!"个数都是5。