線程池,java線程池
線程池
解決了多生產多消費的效率問題
使用了JDK1.5 java.util.concurrent.locks包中的對象。
Lock介面:它的出現比synchronized有更多的操作。
lock():擷取鎖。
unlock():釋放鎖。
同步代碼塊或者同步函數的鎖操作是隱式的。
JDK1.5 Lock介面,按照物件導向的思想,將鎖單獨封裝成了一個對象。
並提供了對鎖的顯示操作。
Lock介面就是同步的替代。
將線程中的同步更換為Lock介面的形式。
替換完運行失敗了。因為wait沒有了同步地區,沒有了所屬的同步鎖。
同步升級了。其中鎖已經不是在任意對象,而是Lock類型的對象。
那麼和任意對象綁定的監視器方法,是不是也升級了,有了專門和Lock類型鎖的綁定的監視器方法呢?
查閱api。Condition介面替代了Object中的監視器方法。
以前監視器方法封裝到每一個對象中。
現在將監視器方法封裝到了Condition對象中。
方法名為:await signal signalAll
監視器對象Condition如何和Lock綁定呢?
---可以通過Lock介面的newCondition()方法完成。
但是,問題依據,一樣喚醒了本方。效率仍舊低!
//描述資源。class Res{private String name;private int count = 1;//建立新Lock。private Lock lock = new ReentrantLock();//建立和Lock綁定的監視器對象。建立兩個。//生產者監視器。private Condition producer_con = lock.newCondition();//消費者監視器private Condition consumer_con = lock.newCondition();//定義標記。private boolean flag;//提供了給商品賦值的方法。public void set(String name)//{//擷取鎖。lock.lock();try{while(flag)//判斷標記為true,執行wait。等待。為false。就生產。try{producer_con.await();}catch(InterruptedException e){}//t0(等) t1(等)this.name = name + "--" + count;//麵包1 ,麵包2 麵包3count++;//2 3 4System.out.println(Thread.currentThread().getName()+"...生產者....."+this.name);//t0 麵包1、 t0 麵包2 t1 ,麵包3//產生完畢,將標記改為true。flag = true;//生產完畢,應該喚醒一個消費者來消費。consumer_con.signal();}finally{//釋放鎖。lock.unlock();}}//提供一個擷取商品的方法。public void get()//{lock.lock();try{while(!flag)try{consumer_con.await();}catch(InterruptedException e){}//t2(等) t3(等)System.out.println(Thread.currentThread().getName()+".......消費者....."+this.name);//t2 麵包1.//將標記改為false。flag = false;//消費完後,應該喚醒生產者一個。producer_con.signal();}finally{lock.unlock();}}}//產生者。class Producer implements Runnable{private Res r;Producer(Res r){this.r = r;}public void run(){while(true)r.set("麵包");}}//消費者class Consumer implements Runnable{private Res r;Consumer(Res r){this.r = r;}public void run(){ while(true)r.get();}} class NewProducerConsumerDemo{public static void main(String[] args) {//1,建立資源。Res r = new Res();//2,建立兩個任務。Producer pro = new Producer(r);Consumer con = new Consumer(r);//3,建立線程。Thread t0 = new Thread(pro);Thread t1 = new Thread(pro);Thread t2 = new Thread(con);Thread t3 = new Thread(con);t0.start();t1.start();t2.start();t3.start();}}