day1 java concurrent包一些知識點
Concurrent:
1. BlockingQueue( 阻塞佇列 )
ArrayBlockingQueue( 指定容量,不可變 ),LinkeBlocingQueue (指定容量不可變,也可以不指定容量,預設 Integer.Max_value )
PriorityBlockingQueue ( 根據實現的介面自定義排序,只有在逐個拿取的時候才有序 )
SynchronousQueue (長度以 1 只能為 1 )
2. ConcurrentMap
ConcurrentHashMap
1.5 分桶加鎖,1.8 CAS+紅黑樹來保證執行緒安全
ConcurrentNavigableMap (針對有序列表,有 map.headMap map.subMap map.tailMap , 返回有序的在取出範圍的 map )
3. CountDownLatch 閉鎖
CountDownLatch 以一個給定的數量初始化。 countDown() 每被呼叫一次,這一數 量就減一。透過呼叫 await() 方法之一,執行緒可以阻塞等待這一數量到達零。
等待一定數量的執行緒完成。來執行其後的程式
4. CyclicBarrier 柵欄
它能夠對處理一些演算法的執行緒實現同
步。換句話講,它就是一個所有執行緒必須等待的一個柵欄,直到所有執行緒都到達這
裡,然後所有執行緒才可以繼續做其他事情
5. Exchanger 交換機
類表示一種兩個執行緒可以進行互相交換物件的會和點 ,只能兩個執行緒之間交換資料
6. Semaphore 訊號量
l
acquire()
l
release()
計數訊號量由一個指定數量的
"
許可
"
初始化。每呼叫一次
acquire()
,一個許可會
被呼叫執行緒取走。每呼叫一次
release()
,一個許可會被返還給訊號量。因此,在沒
有任何
release()
呼叫時,最多有
N
個執行緒能夠透過
acquire()
方法,
N
是該信
號量初始化時的許可的指定數量。
執行緒池
7. ExecutorService
(executors.newFixedThreadPool ,長任務場景,只有核心執行緒,沒有臨時執行緒,容納無限多
,newCachedThreadPool (高併發短任務場景,沒有核心執行緒,全部都是臨時執行緒,處理任意多的執行緒)
,newSingleThreadPool
,newSchedulerThreadPool (有核心執行緒,有臨時執行緒)
)
提交執行緒的方法
execute() 提交執行緒 沒有返回值submit(Runnable) 提交執行緒,返Future 可以透過Future.get()得到該執行緒的狀態但是如果該執行緒未執行完成,那麼該方法阻塞
submit(Callable) 同上面類似,但是執行緒可以帶有返回值
invokeAny(.....),隨機選擇執行緒執行一個
invokeAll(),自動執行所有的執行緒
關閉執行緒池: ExecutorService.shutdown();該方法不再接受執行緒池,等待所有執行緒執行完畢後,執行緒池結束。
ExecutorService.shutdown();立即關閉,退出任務,正在執行的執行緒可能會出錯。
##Callable只能用執行緒池提交
Callable runnable :
1. 返回值
2. 異常, runnabel沒有容錯機制,callable有容錯機制,可以將 異常拋給上層處理
3. Callable只能透過submit方法提交,runnable可以new 也可 以透過執行緒池提交
8. ReadWriteLock 讀寫鎖 ,可以是公平,也可以是非公平的。該鎖可以跨方法
讀鎖可以共享,寫鎖互斥
讀鎖 readLock().lock();
寫鎖 writeLock().lock();
package hgs.test; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.ConcurrentNavigableMap; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.Semaphore; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Test { public static void main(String[] args) throws InterruptedException, BrokenBarrierException { //ConcurrentMap //BlockingQueue<String> bq = new ArrayBlockingQueue<String>(4); //add(超過長度會報錯) remove(沒有元素會報錯) /* bq.add("1"); bq.add("1"); bq.add("1"); bq.add("1"); bq.remove(); bq.remove(); bq.remove(); bq.remove(); */ //offer(如果可以插入返回true 否則 false) poll(如果沒有元素返回null) //bq.offer("1"); //bq.offer("1"); //bq.offer("1"); //bq.offer("1"); //bq.offer("1"); //String flag = bq.poll(); //System.out.println(flag); //put take 阻塞式 //bq.put("1"); //bq.put("1"); //bq.put("1"); //bq.put("1"); //bq.put("1"); //bq.put("1"); //bq.take(); //offer(o,timeout,timeunit),poll(timeout,tameunit) 等待timeout時間,然後跳過 //bq.poll(10, TimeUnit.SECONDS); //bq.element();//檢查是否為空,是的話跑出異常 //bq.peek();//阻塞 /* ConcurrentNavigableMap<Integer ,String> m = new ConcurrentSkipListMap<Integer, String>() ; m.put(1, "1"); m.put(2, "2"); m.put(5, "5"); m.put(4, "4"); m.put(6, "6"); m.put(5, "5"); System.out.println("head(\"5\")"+m.headMap(4)); System.out.println(); System.out.println();*/ /*Boy b1 = new Boy("b1",24); Boy b2 = new Boy("b2",23); Boy b3 = new Boy("b3",26); Boy b4 = new Boy("b4",19); PriorityBlockingQueue< Boy> pbq = new PriorityBlockingQueue<Boy>(100); pbq.add(b1); pbq.add(b2); pbq.add(b3); pbq.add(b4); for(int i =0 ;i<4;i++) { System.out.println(pbq.take().toString()); } */ //閉鎖 /*CountDownLatch cdl = new CountDownLatch(4); for(int i = 0; i<4; i++) { new Thread(new BoyRun(cdl)).start(); } cdl.await(); System.out.println("全部到達。。。");*/ //柵欄 /*CyclicBarrier cb = new CyclicBarrier(4); for(int i = 0; i<4; i++) { new Thread(new GirlRan(cb)).start(); } cb.await(); System.out.println("all comming.");*/ //exchanger交換器 /*Exchanger<String> ex = new Exchanger<String>(); ExchangerTest e1 = new ExchangerTest(ex); ExchangerTest e2 = new ExchangerTest(ex); new Thread(e1).start(); new Thread(e2).start(); */ //6.Semaphore 訊號量 /* Semaphore s = new Semaphore(5); for(int i = 0 ;i<9;i++) { new SemaphoreTest(s).start(); }*/ //原始建立執行緒池,executors.newCacheThreadPool 的底層呼叫該方法 /* ExecutorService es = new ThreadPoolExecutor(5, 10, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { System.out.println("full......"); } }); for(int i = 0 ;i<24;i++) { es.execute(new ThreadPoolTest()); } es.shutdown();*/ //可重入鎖 ReentrantLock 可重入讀寫鎖ReentrantReadWriteLock /* ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); for (int i = 0 ;i<3;i++) { new ReadLockTest( rwLock ).start(); }*/ ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); for (int i = 0 ;i<3;i++) { new WriteLockTest( rwLock ).start(); } } } class WriteLockTest extends Thread{ ReentrantReadWriteLock rwLock ; public WriteLockTest(ReentrantReadWriteLock rwLock ) { this.rwLock = rwLock; } @Override public void run() { rwLock.writeLock().lock(); System.out.println("reading......"); try { Thread.sleep((long)(Math.random()*2000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("done......"); rwLock.writeLock().unlock(); } } class ReadLockTest extends Thread{ ReentrantReadWriteLock rwLock ; public ReadLockTest(ReentrantReadWriteLock rwLock ) { this.rwLock = rwLock; } @Override public void run() { rwLock.readLock().lock(); System.out.println("reading......"); try { Thread.sleep((long)(Math.random()*2000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("done......"); rwLock.readLock().unlock(); } } class ThreadPoolTest implements Runnable{ ThreadPoolTest (){ } @Override public void run() { System.out.println(Thread.currentThread().getName()); try { Thread.sleep((long)(Math.random()*2000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class SemaphoreTest extends Thread{ Semaphore s = null; public SemaphoreTest(Semaphore s) { this.s = s; } @Override public void run() { try { s.acquire(); System.out.println("aquire......"); Thread.sleep((long)(Math.random()*3000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("release......"); s.release(); } } class ExchangerTest implements Runnable{ Exchanger<String> ex = null; public ExchangerTest(Exchanger<String> ex) { this.ex = ex; } @Override public void run() { String my = Thread.currentThread().getName(); String exstr = null; try { exstr = ex.exchange(my); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(my+" "+exstr); } } class BoyRun implements Runnable{ CountDownLatch cdl ; public BoyRun(CountDownLatch cdl ) { this.cdl = cdl; } @Override public void run() { System.out.println("cdl"+" +1"); cdl.countDown(); System.out.println("cdl"+" +1--"); } } class GirlRan implements Runnable { CyclicBarrier cb ; public GirlRan(CyclicBarrier cb ) { this.cb = cb; } @Override public void run() { System.out.println("cdl"+" +1"); try { Thread.sleep((long)(Math.random()*5000)); cb.await(); } catch (InterruptedException | BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("cdl"+" +1--"); } } class Boy implements Comparable<Boy>{ String name; int age; public Boy(String name ,int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int compareTo(Boy o) { return this.age - o.age; } @Override public String toString() { return "Boy [name=" + name + ", age=" + age + "]"; } }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2216629/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java NIO和Concurrent包的一些知識點Java
- Java中類的一些知識點Java
- Oracle_day1(小知識點)Oracle
- Java併發---concurrent包Java
- java中的介面一些知識點———— 程式碼Java
- java.uitl.concurrent包研究JavaUI
- 資源包的一些知識
- java小知識點Java
- mysql的一些知識點MySql
- CGI的一些知識點
- Jquery的一些知識點jQuery
- 一些cookie的知識點Cookie
- JAVA之Concurrent包書目錄Java
- Vue一些知識點總結Vue
- PLSQL一些常用的知識點SQL
- 雜湊的一些知識點
- 【JAVA】- 知識點小結Java
- Java 知識點總結Java
- Java 反射【前置知識點】Java反射
- java基礎知識點Java
- java知識點-高階Java
- java Web知識點(2)JavaWeb
- Java知識點總結Java
- Java知識點學習Java
- java知識點彙總Java
- java 重寫知識點Java
- java 多型知識點Java多型
- Java與C/C++不同的一些基礎知識點JavaC++
- 關於AP的一些知識點
- vue的一些基礎知識點Vue
- RHCE考試的一些知識點
- Java基礎知識點梳理Java
- 【Java】容器相關知識點Java
- java面試知識點總結Java面試
- Java 面試知識點總結Java面試
- java知識點學習圖Java
- Java 基礎面試知識點Java面試
- java日常知識點積累Java