亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java多線程學習-java.util.concurrent詳解(二)Semaphore/FutureTask/Exchanger

2019-11-11 06:52:56
字體:
來源:轉載
供稿:網友

java多線程學習-java.util.concurrent詳解(二)Semaphore/FutureTask/Exchanger

3. Semaphore 

    我們先來學習一下JDK1.5 API中關于這個類的詳細介紹: “一個計數信號量。從概念上講,信號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然后再獲取該許可。每個 release() 添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore 只對可用許可的號碼進行計數,并采取相應的行動。”     我們一般用它來控制某個對象的線程訪問對象     例如,對于某個容器,我們規定,最多只能容納n個線程同時操作 使用信號量來模擬實現 

具體代碼如下(參考 [JCip]) 

import java.util.Collections;  import java.util.HashSet;  import java.util.Set;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  import java.util.concurrent.Semaphore;    public class TestSemaphore {        public static void main(String[] args) {          ExecutorService exec = Executors.newCachedThreadPool();          TestSemaphore t = new TestSemaphore();          final BoundedHashSet<String> set = t.getSet();            for (int i = 0; i < 3; i++) {//三個線程同時操作add              exec.execute(new Runnable() {                  public void run() {                      try {                          set.add(Thread.currentThread().getName());                      } catch (InterruptedException e) {                          e.PRintStackTrace();                      }                  }              });          }            for (int j = 0; j < 3; j++) {//三個線程同時操作remove              exec.execute(new Runnable() {                  public void run() {                      set.remove(Thread.currentThread().getName());                  }              });          }          exec.shutdown();      }        public BoundedHashSet<String> getSet() {          return new BoundedHashSet<String>(2);//定義一個邊界約束為2的線程      }        class BoundedHashSet<T> {          private final Set<T> set;          private final Semaphore semaphore;            public BoundedHashSet(int bound) {              this.set = Collections.synchronizedSet(new HashSet<T>());              this.semaphore = new Semaphore(bound, true);          }            public void add(T o) throws InterruptedException {              semaphore.acquire();//信號量控制可訪問的線程數目              set.add(o);              System.out.printf("add:%s%n",o);          }            public void remove(T o) {              if (set.remove(o))                  semaphore.release();//釋放掉信號量              System.out.printf("remove:%s%n",o);          }      }  }   總結:Semaphore通常用于對象池的控制 

4.FutureTask     我們先來學習一下JDK1.5 API中關于這個類的詳細介紹:     “取消的異步計算。利用開始和取消計算的方法、查詢計算是否完成的方法和獲取計算結果的方法,此類提供了對 Future 的基本實現。僅在計算完成時才能獲取結果;如果計算尚未完成,則阻塞 get 方法。一旦計算完成,就不能再重新開始或取消計算。 可使用 FutureTask 包裝 Callable 或 Runnable 對象。因為 FutureTask 實現了 Runnable,所以可將 FutureTask 提交給 Executor 執行。 除了作為一個獨立的類外,此類還提供了 protected 功能,這在創建自定義任務類時可能很有用。 “     應用舉例:我們的算法中有一個很耗時的操作,在編程的是,我們希望將它獨立成一個模塊,調用的時候當做它是立刻返回的,并且可以隨時取消的 具體代碼如下(參考 [JCIP]) 

import java.util.concurrent.Callable;  import java.util.concurrent.ExecutionException;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  import java.util.concurrent.FutureTask;    public class TestFutureTask {        public static void main(String[] args) {          ExecutorService exec=Executors.newCachedThreadPool();                    FutureTask<String> task=new FutureTask<String>(new Callable<String>(){//FutrueTask的構造參數是一個Callable接口              @Override              public String call() throws Exception {                  return Thread.currentThread().getName();//這里可以是一個異步操作              }});                            try {                  exec.execute(task);//FutureTask實際上也是一個線程                  String result=task.get();//取得異步計算的結果,如果沒有返回,就會一直阻塞等待                  System.out.printf("get:%s%n",result);              } catch (InterruptedException e) {                  e.printStackTrace();              } catch (ExecutionException e) {                  e.printStackTrace();              }      }    }  總結:FutureTask其實就是新建了一個線程單獨執行,使得線程有一個返回值,方便程序的編寫

5. Exchanger     我們先來學習一下JDK1.5 API中關于這個類的詳細介紹:     “可以在pair中對元素進行配對和交換的線程的同步點。每個線程將條目上的某個方法呈現給 exchange 方法,與伙伴線程進行匹配,并且在返回時接收其伙伴的對象。Exchanger 可能被視為 SynchronousQueue 的雙向形式。Exchanger 可能在應用程序(比如遺傳算法和管道設計)中很有用。 “     應用舉例:有兩個緩存區,兩個線程分別向兩個緩存區fill和take,當且僅當一個滿了,兩個緩存區交換     代碼如下(參考了網上給的示例   http://hi.baidu.com/webidea/blog/item/2995e731e53ad5a55fdf0e7d.html) 

import java.util.ArrayList;  import java.util.concurrent.Exchanger;    public class TestExchanger {        public static void main(String[] args) {          final Exchanger<ArrayList<Integer>> exchanger = new Exchanger<ArrayList<Integer>>();          final ArrayList<Integer> buff1 = new ArrayList<Integer>(10);          final ArrayList<Integer> buff2 = new ArrayList<Integer>(10);            new Thread(new Runnable() {              @Override              public void run() {                  ArrayList<Integer> buff = buff1;                  try {                      while (true) {                          if (buff.size() >= 10) {                              buff = exchanger.exchange(buff);//開始跟另外一個線程交互數據                              System.out.println("exchange buff1");                              buff.clear();                          }                          buff.add((int)(Math.random()*100));                          Thread.sleep((long)(Math.random()*1000));                      }                  } catch (InterruptedException e) {                      e.printStackTrace();                  }              }          }).start();                    new Thread(new Runnable(){              @Override              public void run() {                  ArrayList<Integer> buff=buff2;                  while(true){                      try {                          for(Integer i:buff){                              System.out.println(i);                          }                          Thread.sleep(1000);                          buff=exchanger.exchange(buff);//開始跟另外一個線程交換數據                          System.out.println("exchange buff2");                      } catch (InterruptedException e) {                          e.printStackTrace();                      }                  }              }}).start();      }  }  總結:Exchanger在特定的使用場景比較有用(兩個伙伴線程之間的數據交互) 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91深夜福利视频| 亚洲在线www| 中文字幕少妇一区二区三区| 欧美丰满少妇xxxxx做受| 91久久精品久久国产性色也91| 97视频在线播放| 欧美日韩另类在线| 中文字幕国产精品| 最新国产成人av网站网址麻豆| 欧美老女人xx| 亚洲精品中文字幕有码专区| 久久精品亚洲一区| 91国偷自产一区二区三区的观看方式| 91在线中文字幕| 97视频人免费观看| 91日韩在线播放| 亚洲欧美另类人妖| 成人网欧美在线视频| 亚洲午夜精品久久久久久久久久久久| 午夜精品一区二区三区在线视| 亚洲偷欧美偷国内偷| 成人性生交大片免费看小说| 国产精欧美一区二区三区| 欧美做爰性生交视频| 亚洲第一页在线| 亚洲国产欧美一区二区丝袜黑人| 久久久精品免费视频| 亚洲精品美女在线观看播放| 欧美午夜影院在线视频| 91豆花精品一区| 亚洲成人精品久久久| 国产成人精品一区二区三区| 精品中文字幕在线2019| 欧美久久精品午夜青青大伊人| 欧美日韩国产第一页| 国产精品免费一区| 欧美大胆在线视频| 欧美高清性猛交| 97久久久久久| 国产精品久久久久久久天堂| 91po在线观看91精品国产性色| 国产精品爽爽爽| 久久久免费精品视频| 久久男人av资源网站| 久久成年人视频| 久久国产精品视频| 爽爽爽爽爽爽爽成人免费观看| 欧美疯狂做受xxxx高潮| 日本一区二区三区四区视频| 精品香蕉在线观看视频一| 国产精品久久久久免费a∨大胸| 97av在线播放| 欧美高清在线播放| 欧美成年人视频网站| 国产偷亚洲偷欧美偷精品| 日韩激情第一页| 日韩精品免费在线视频观看| 精品一区二区亚洲| 狠狠干狠狠久久| 久99九色视频在线观看| 久久精品国产亚洲精品| 红桃视频成人在线观看| 日本精品在线视频| 国产精品久久久久99| 午夜精品99久久免费| 日韩欧美黄色动漫| 欧美华人在线视频| 日本久久久久亚洲中字幕| 欧美一性一乱一交一视频| 日韩电影大全免费观看2023年上| 亚洲欧美中文日韩在线v日本| 国产精品美女免费| 亚洲国产欧美自拍| 精品国产依人香蕉在线精品| 久久九九精品99国产精品| 国产91在线高潮白浆在线观看| 亚洲国产女人aaa毛片在线| 中文字幕国产日韩| 日韩在线视频网站| 久久青草福利网站| 欧美精品久久久久久久免费观看| 亚洲国产成人久久| 亚洲一区美女视频在线观看免费| 97视频免费在线观看| 精品久久久久久国产| 欧美俄罗斯乱妇| 日韩欧美在线播放| 久久久精品美女| 96精品久久久久中文字幕| 综合欧美国产视频二区| 国产日韩欧美自拍| 国产精品一区久久久| 欧美激情亚洲一区| 国产视频精品在线| 中文国产亚洲喷潮| 日韩av最新在线观看| 久久成人av网站| 亚洲精品小视频| 欧美综合一区第一页| 久久久av亚洲男天堂| 久久久在线视频| 精品久久久精品| 欧美精品第一页在线播放| 国产伊人精品在线| 欧美日韩国产一区二区三区| 国产91成人在在线播放| 深夜福利亚洲导航| 欧美久久精品一级黑人c片| 欧美与欧洲交xxxx免费观看| 欧美在线视频导航| 亚洲午夜精品久久久久久性色| 亚洲国产婷婷香蕉久久久久久| 国产在线精品成人一区二区三区| 久久69精品久久久久久国产越南| 国产一区二区视频在线观看| 国产精品吹潮在线观看| 性色av一区二区三区| 国产区精品视频| 欧美极度另类性三渗透| 国产成人在线一区二区| 国产成人久久久| 成人av资源在线播放| 国产精品成人久久久久| 亚洲一区二区三区视频播放| 日本不卡视频在线播放| 青青久久aⅴ北条麻妃| 久久综合伊人77777尤物| 成人日韩在线电影| 亚洲人成在线观看| 91在线看www| 欧美日韩第一页| 国产亚洲精品美女| 91精品国产电影| 国产精品第二页| 国产va免费精品高清在线观看| 57pao成人永久免费视频| 久久久久久久久国产精品| 国产亚洲精品美女久久久久| 亚洲无限乱码一二三四麻| 国产精品久久久久久久电影| 欧美激情免费在线| 成人日韩av在线| 欧美性猛交xxxx免费看| 欧美日韩激情视频8区| 成人性生交大片免费看视频直播| 亚洲欧美中文字幕| 国产精品一区专区欧美日韩| 亲爱的老师9免费观看全集电视剧| 久久久最新网址| 亚洲日韩欧美视频一区| 久久成人精品一区二区三区| 欧洲成人在线视频| 精品亚洲夜色av98在线观看| 久久精品国产清自在天天线| 成人av电影天堂| 色樱桃影院亚洲精品影院| 亚洲欧美制服丝袜| 久久中文字幕在线| 国产91精品网站| 97色在线视频观看| 国产精品免费一区二区三区都可以| 久久综合亚洲社区| 中文字幕亚洲激情| 久久久这里只有精品视频|