java多執行緒之ReentrantLock和 Condition
阿新 • • 發佈:2018-12-09
ReentrantLock 是JDK中內建鎖,也稱可重入鎖,API也較為簡單。
Condition 可實現 執行緒間通訊,由ReentrantLock 例項產生即 lock.new Condition();
下面這個demo模擬最簡單的生產者 消費者模式,Add執行緒模擬生產者執行生產任務,Get任務執行模擬消費者執行消費任務,Task類種有add和get兩個方法一個用於生產物件,一個用於消費物件。
package test.concurrent; import java.util.ArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestCondition { public static ArrayList list = new ArrayList(); public static void main(String[] args) { ExecutorService threadPool = Executors.newFixedThreadPool(2); threadPool.execute(new Add()); threadPool.execute(new Get()); } public static class Task{ private static Lock lock= new ReentrantLock(); private static Condition condition = lock.newCondition(); public static void add(Object obj) { lock.lock(); try { list.add(obj); System.out.println("有新成員加入"+obj); condition.signal(); } catch (Exception e) { // TODO: handle exception }finally { lock.unlock(); } } public static void get() { lock.lock(); try { while(list.size()<0) { condition.await(); } System.out.println("取出;"+list.remove(0)); } catch (Exception e) { // TODO: handle exception }finally { lock.unlock(); } } } /** * 存錢 * @author Administrator * */ public static class Add implements Runnable{ @Override public void run() { // TODO Auto-generated method stub while(true) { Task.get(); } } } /** * 取錢 * @author Administrator * */ public static class Get implements Runnable{ @Override public void run() { // TODO Auto-generated method stub int i =0; while(true) { i++; Task.add("我是第:"+i+"個"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }