注:大佬勿噴/
1,Condition的方法:第一次看到之后是否感覺到這應該是我看到方法數量極少數極少數類之一了吧。好了,我們先來說大概意思。wait: 等待嘛,沒什么大的事情,只是在前面加個“a"加以區別(個人理解啊)。
2,await():表示一直等待,直到被喚醒為止。
await(long,TimeUnit): 這個是超時返回,給定一個時間,超過這個時間沒有處理,則返回false。
signal();從等待隊列喚醒一個,signalAll()則是全部喚醒了。其它的。。。
3. 實現
//通過ReentrantLock 關聯 Condition static ReentrantLock lock = new ReentrantLock(); static Condition condition = lock.newCondition();
//創建一個線程類
public static class T1 extends Thread{ public T1(String name) { super(name); } @Override public void run() { //加鎖 lock.lock(); System.out.println(System.currentTimeMillis() + " , " + this.getName() + " , start"); try { //參數await()方法;如果沒有中斷消息,則超時,返回false boolean r = condition.await(5, TimeUnit.SECONDS); System.out.println(r); //awaitNanos方法(); // long r1 = condition.awaitNanos(TimeUnit.SECONDS.toNanos(5)); // System.out.println(r1); System.out.println(System.currentTimeMillis() + " , " + this.getName() + " , end"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //解鎖 lock.unlock(); } } }
然后就是main函數:
//聲明 3個線程 public static void main(String[] args) throws InterruptedException { new T1("線程1").start(); new T1("線程2").start(); new T1("線程3").start(); //休眠2s--> 返回? TimeUnit.SECONDS.sleep(2); //這是喚醒線程了 lock.lock(); try { // condition.signalAll(); condition.signal(); } finally { lock.unlock(); } }
結果:
接一下我們把 signal() 改為 signalAll():
好了,condition的簡單應用結束了