您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)java多線程中如何實現(xiàn)線程并發(fā)庫,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
java.util.concurrent.atomic
包下的類:
Package java.util.concurrent.atomic
java.util.concurrent:Class Executors
幾種常用的的生成線程池的方法:
newCachedThreadPool
newFixedThreadPool
newScheduledThreadPool
newSingleThreadExecutor
newSingleThreadScheduledExecutor
例子:newFixedThreadPool
ExecutorService threadPool = Executors.newFixedThreadPool(3); for(int i=0;i<10;i++){ threadPool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); }
單線程newSingleThreadExecutor
可用于重啟
用線程池啟動定時器
例子:類似Timer的定時執(zhí)行
Executors.newScheduledThreadPool(3).scheduleAtFixedRate( new Runnable() { @Override public void run() { System.out.println("ScheduledThreadPool "+Thread.currentThread().getName()); } },3,1, TimeUnit.SECONDS );
ExecutorService
在Executor
的基礎(chǔ)上增加了一些方法,其中有兩個核心的方法:
Future<?> submit(Runnable task)
<T> Future<T> submit(Callable<T> task)
這兩個方法都是向線程池中提交任務(wù),它們的區(qū)別在于Runnable
在執(zhí)行完畢后沒有結(jié)果,Callable
執(zhí)行完畢后有一個結(jié)果。這在多個線程中傳遞狀態(tài)和結(jié)果是非常有用的。另外他們的相同點在于都返回一個Future對象。Future
對象可以阻塞線程直到運行完畢(獲取結(jié)果,如果有的話),也可以取消任務(wù)執(zhí)行,當(dāng)然也能夠檢測任務(wù)是否被取消或者是否執(zhí)行完畢。
Lock功能類似傳統(tǒng)多線程技術(shù)里的synchronized
,實現(xiàn)線程互斥,但更加面向?qū)ο?。將需要互斥的代碼片段放到lock.lock();
和lock.unlock();
之間。
例子
class A{ private Lock lock = new ReentrantLock(); public void function(){ lock.lock(); try{ //功能代碼 }finally{ lock.unlock(); } } }
讀寫鎖
java.util.concurrent.locks:Class ReentrantReadWriteLock
javaDoc文檔讀寫鎖例子,緩存:
class CachedData { Object data; volatile boolean cacheValid; final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock(); if (!cacheValid) { // Must release read lock before acquiring write lock rwl.readLock().unlock(); rwl.writeLock().lock(); try { // Recheck state because another thread might have // acquired write lock and changed state before we did. if (!cacheValid) { data = ... cacheValid = true; } // Downgrade by acquiring read lock before releasing write lock rwl.readLock().lock(); } finally { rwl.writeLock().unlock(); // Unlock write, still hold read } } try { use(data); } finally { rwl.readLock().unlock(); } } }
重點注意在釋放寫鎖前加讀鎖那部分代碼,注釋為 // Downgrade by acquiring read lock before releasing write lock
。自己掛了寫鎖,再掛讀鎖是可以的,這面涉及的技巧以后再研究。
Condition類似于傳統(tǒng)多線程技術(shù)中的Object.wait
和Object.notify
,實現(xiàn)線程間同步。
javaDoc文檔例子,可阻塞隊列
class BoundedBuffer例子
class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) notFull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); } finally { lock.unlock(); } } public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notEmpty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); return x; } finally { lock.unlock(); } } }
使用了兩個condition
Semaphore
類似占坑
CyclicBarrier
階段性使進(jìn)度一致
CountDownLatch
一人通知多人/多人通知一人
Exchanger
線程間數(shù)據(jù)交換,都到達(dá)則自然交換
以上就是java多線程中如何實現(xiàn)線程并發(fā)庫,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。