溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java多線程中如何實現(xiàn)線程并發(fā)庫

發(fā)布時間:2021-10-12 09:15:26 來源:億速云 閱讀:123 作者:柒染 欄目:云計算

本篇文章給大家分享的是有關(guān)java多線程中如何實現(xiàn)線程并發(fā)庫,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

多線程之線程并發(fā)庫

原子性操作類

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
    );

Callable&Future

ExecutorServiceExecutor的基礎(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&Condition

Lock

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

Condition類似于傳統(tǒng)多線程技術(shù)中的Object.waitObject.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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI