日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java读书笔记(4)-多线程(二)

發(fā)布時間:2024/4/17 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java读书笔记(4)-多线程(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Java讀書筆記(4)-多線程(二)

2016-1-2

  • 線程通信

    • 傳統(tǒng)的線程通信

      • Object類提供了wait()notify()notifyAll三個方法

      • 適用情況:synchronized修飾的同步方法或者synchronized方法

      • wait():導(dǎo)致當(dāng)前線程等待,直到其他線程調(diào)用該同步監(jiān)視器的notify()notifyAll方法來喚醒該線程,調(diào)用wait方法后本線程會釋放對同步監(jiān)視器的鎖定

      • notify():喚醒在此同步監(jiān)視器上等待的單個線程。如果有多個線程在等待,則隨機(jī)喚醒其中一個

      • notifyAll():喚醒在此同步監(jiān)視器上等待的所有線程

    • 使用Condition控制線程通信

      • 適用于使用Lock對象來同步的場景,Condition實例被綁定在一個Lock對象

      • Lock替代了同步方法或同步代碼塊,Condition替代了同步監(jiān)視器的功能

      • await(),signal(),signalAll()

      • private final Lock lock=new ReentrantLock();

      • private final Condition cond=lock.newCondition();

      • cond.await()

      • cond.signalAll()

    • 使用阻塞隊列(BlockingQueue)控制線程通信

      • add(E e), off(E e), put(E e)

      • remove(), poll(), take()

      • element(), peek()

    • ArrayBlockinQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue, DelayQueue

    • BlockingQueue<Stirng> bq=new ArrayBlockingQueue<>(2);

      bg.put(“Java”)

  • 線程組(ThreadGroup)和未處理的異常

      • 程序可以直接以組為單位控制線程

      • 線程運(yùn)行途中不能更改所屬線程組

      • ThreadGroup:activeCount(), interrupt(), isDaemon(), setDaemon(), setMaxPriority()

      • ThreadGroup內(nèi)還定義了一個很有用的方法:void uncaughtException(Thread t,Throwable e), 可以處理線程組內(nèi)任意線程所拋出的異常

      • 使用catch捕獲異常時,異常不會傳播給上一級調(diào)用者;但是使用異常處理器對異常進(jìn)行處理后,異常依然會傳播給上一級調(diào)用者

  • 線程池

    • 當(dāng)程序中需要創(chuàng)建大量生存期很短暫的線程時,應(yīng)該考慮使用線程池。線程池在系統(tǒng)啟動時即創(chuàng)建大量空閑的線程

    • Java5實現(xiàn)的線程池

      • 返回一個ExecutorService對象,該對象代表一個線程池:newCachedThreadPool()newFixedThreadPool(int nThreads),newSingleThreadExecutor()

      • new ScheduledThreadPool(int corePoolSize),new SingleThreadScheduledExecutor()

      • 使用線程池來執(zhí)行線程任務(wù)的步驟:

      • 調(diào)用Executors類的靜態(tài)工廠方法來創(chuàng)建一個ExecutorService對象,該對象代表一個線程池;

      • 創(chuàng)建Runnable實現(xiàn)類或Callable實現(xiàn)類的實例,作為線程執(zhí)行任務(wù);

      • 調(diào)用ExecutorService對象的submit()方法來提交Runnable實例或者Callable實例;

      • 任務(wù)執(zhí)行完畢,最后關(guān)閉線程池shutdown()

    • Java7新增的ForkJoinPool

      • 充分利用多CPU,多核CPU的性能優(yōu)勢

      • 將一個任務(wù)拆分成多個“小任務(wù)”并行計算,再把多個小任務(wù)的結(jié)果合并成總的計算結(jié)果

      • ForkJoinPoolExecutorService的實現(xiàn)類,因此是一種特殊的線程池

      • 創(chuàng)建了ForkJoinPool實例之后,就可以調(diào)用ForkJoinPoolsubmit(ForkJoinTask task)或者invoke(ForkJoinTask task)方法來執(zhí)行指定任務(wù)了。其中ForkJoinTask代表一個可以并行,合并的任務(wù)。ForkJoinTask是一個抽象類,它還有兩個抽象子類:RecursiveActionRecursiveTask。其中RecursiveTask代表有返回值的任務(wù),而RecursiveAction代表沒有返回值的任務(wù)。

  • 線程相關(guān)類

    • ThreadLocal

      • 代表一個線程局部變量,通過把數(shù)據(jù)放在ThreadLocal中就可以讓每個線程創(chuàng)建一個該變量的副本

      • 在編寫多線程代碼時,可以把不安全的整個變量封裝進(jìn)ThreadLocal,或者把對象與線程相關(guān)的狀態(tài)使用ThreadLocal保存

      • ThreadLocal類與線程同步機(jī)制面向的問題領(lǐng)域是不同的

      • 如果多個資源之間需要共享資源,以實現(xiàn)線程通信,則使用同步機(jī)制;如果僅僅只是隔離多個線程之間的沖突,則使用ThreadLocal

    • 包裝線程不安全的集合

      • 可以使用Collections提供的靜態(tài)方法把這些集合包裝成線程安全的集合。

      • <T> Collection<T> synchronizedCollections(Collection<T> c):返回指定collection對應(yīng)的線程安全的collection

      • static <T> List<T> synchronizedList(List<T> list)

      • static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)

      • static <T> Set<T> synchronizedSet(Set<T> s)

      • static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)

      • static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)

      • 如果需要把某個集合包裝成線程安全的集合,則應(yīng)該在創(chuàng)建之后立即包裝

        HashMap m=Collections.synchronizedMap(new HashMap());

    • 線程安全的集合類

      • java.util.concurrent

      • 支持高效并發(fā)訪問的集合接口和實現(xiàn)類

      • Concurrent開頭的集合類:支持并發(fā)訪問的集合

      • CopyOnWrite開頭的集合類:適合讀取操作遠(yuǎn)遠(yuǎn)大于寫入操作的場景,如緩存等

  • posted on 2016-01-03 10:28 pojowsh 閱讀(...) 評論(...) 編輯 收藏

    轉(zhuǎn)載于:https://www.cnblogs.com/hust_wsh/p/5095858.html

    總結(jié)

    以上是生活随笔為你收集整理的Java读书笔记(4)-多线程(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。