日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java異步調用轉同步的方法

瀏覽:126日期:2022-08-19 08:46:41

先來說一下對異步和同步的理解:

同步調用:調用方在調用過程中,持續(xù)等待返回結果。異步調用:調用方在調用過程中,不直接等待返回結果,而是執(zhí)行其他任務,結果返回形式通常為回調函數。

其實,兩者的區(qū)別還是很明顯的,這里也不再細說,我們主要來說一下Java如何將異步調用轉為同步。換句話說,就是需要在異步調用過程中,持續(xù)阻塞至獲得調用結果。不賣關子,先列出五種方法,然后一一舉例說明:

使用wait和notify方法 使用條件鎖 Future 使用CountDownLatch 使用CyclicBarrier 1.構造一個異步調用

首先,寫demo需要先寫基礎設施,這里的話主要是需要構造一個異步調用模型。異步調用類:

public class AsyncCall { private Random random = new Random(System.currentTimeMillis()); private ExecutorService tp = Executors.newSingleThreadExecutor(); //demo1,2,4,5調用方法 public void call(BaseDemo demo){ new Thread(()->{ long res = random.nextInt(10); try {Thread.sleep(res*1000); } catch (InterruptedException e) {e.printStackTrace(); } demo.callback(res); }).start(); } //demo3調用方法 public Future<Long> futureCall(){ return tp.submit(()-> { long res = random.nextInt(10); try {Thread.sleep(res*1000); } catch (InterruptedException e) {e.printStackTrace(); } return res; }); } public void shutdown(){ tp.shutdown(); }}

我們主要關心call方法,這個方法接收了一個demo參數,并且開啟了一個線程,在線程中執(zhí)行具體的任務,并利用demo的callback方法進行回調函數的調用。大家注意到了這里的返回結果就是一個[0,10)的長整型,并且結果是幾,就讓線程sleep多久——這主要是為了更好地觀察實驗結果,模擬異步調用過程中的處理時間。至于futureCall和shutdown方法,以及線程池tp都是為了demo3利用Future來實現做準備的。demo的基類:

public abstract class BaseDemo { protected AsyncCall asyncCall = new AsyncCall(); public abstract void callback(long response); public void call(){ System.out.println('發(fā)起調用'); asyncCall.call(this); System.out.println('調用返回'); }}

BaseDemo非常簡單,里面包含一個異步調用類的實例,另外有一個call方法用于發(fā)起異步調用,當然還有一個抽象方法callback需要每個demo去實現的——主要在回調中進行相應的處理來達到異步調用轉同步的目的。

2. 使用wait和notify方法

這個方法其實是利用了鎖機制,直接貼代碼:

public class Demo1 extends BaseDemo{ private final Object lock = new Object(); @Override public void callback(long response) { System.out.println('得到結果'); System.out.println(response); System.out.println('調用結束'); synchronized (lock) { lock.notifyAll(); } } public static void main(String[] args) { Demo1 demo1 = new Demo1(); demo1.call(); synchronized (demo1.lock){ try {demo1.lock.wait(); } catch (InterruptedException e) {e.printStackTrace(); } } System.out.println('主線程內容'); }}

可以看到在發(fā)起調用后,主線程利用wait進行阻塞,等待回調中調用notify或者notifyAll方法來進行喚醒。注意,和大家認知的一樣,這里wait和notify都是需要先獲得對象的鎖的。在主線程中最后我們打印了一個內容,這也是用來驗證實驗結果的,如果沒有wait和notify,主線程內容會緊隨調用內容立刻打印;而像我們上面的代碼,主線程內容會一直等待回調函數調用結束才會進行打印。沒有使用同步操作的情況下,打印結果:

發(fā)起調用調用返回主線程內容得到結果1調用結束

而使用了同步操作后:

發(fā)起調用調用返回得到結果9調用結束主線程內容3. 使用條件鎖

和方法一的原理類似:

public class Demo2 extends BaseDemo { private final Lock lock = new ReentrantLock(); private final Condition con = lock.newCondition(); @Override public void callback(long response) { System.out.println('得到結果'); System.out.println(response); System.out.println('調用結束'); lock.lock(); try { con.signal(); }finally { lock.unlock(); } } public static void main(String[] args) { Demo2 demo2 = new Demo2(); demo2.call(); demo2.lock.lock(); try { demo2.con.await(); } catch (InterruptedException e) { e.printStackTrace(); }finally { demo2.lock.unlock(); } System.out.println('主線程內容'); }}

基本上和方法一沒什么區(qū)別,只是這里使用了條件鎖,兩者的鎖機制有所不同。

4. Future

使用Future的方法和之前不太一樣,我們調用的異步方法也不一樣。

public class Demo3{ private AsyncCall asyncCall = new AsyncCall(); public Future<Long> call(){ Future<Long> future = asyncCall.futureCall(); asyncCall.shutdown(); return future; } public static void main(String[] args) { Demo3 demo3 = new Demo3(); System.out.println('發(fā)起調用'); Future<Long> future = demo3.call(); System.out.println('返回結果'); while (!future.isDone() && !future.isCancelled()); try { System.out.println(future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println('主線程內容'); }}

我們調用futureCall方法,方法中會想線程池tp提交一個Callable,然后返回一個Future,這個Future就是我們demo3中call中得到的,得到future對象之后就可以關閉線程池啦,調用asyncCall的shutdown方法。關于關閉線程池這里有一點需要注意,我們回過頭來看看asyncCall的shutdown方法:

public void shutdown(){ tp.shutdown(); }

發(fā)現只是簡單調用了線程池的shutdown方法,然后我們說注意的點,這里最好不要用tp的shutdownNow方法,該方法會試圖去中斷線程中中正在執(zhí)行的任務;也就是說,如果使用該方法,有可能我們的future所對應的任務將被中斷,無法得到執(zhí)行結果。然后我們關注主線程中的內容,主線程的阻塞由我們自己來實現,通過future的isDone和isCancelled來判斷執(zhí)行狀態(tài),一直到執(zhí)行完成或被取消。隨后,我們打印get到的結果。

5. 使用CountDownLatch

使用CountDownLatch或許是日常編程中最常見的一種了,也感覺是相對優(yōu)雅的一種:

public class Demo4 extends BaseDemo{ private final CountDownLatch countDownLatch = new CountDownLatch(1); @Override public void callback(long response) { System.out.println('得到結果'); System.out.println(response); System.out.println('調用結束'); countDownLatch.countDown(); } public static void main(String[] args) { Demo4 demo4 = new Demo4(); demo4.call(); try { demo4.countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('主線程內容'); }}

正如大家平時使用的那樣,此處在主線程中利用CountDownLatch的await方法進行阻塞,在回調中利用countDown方法來使得其他線程await的部分得以繼續(xù)運行。當然,這里和demo1和demo2中都一樣,主線程中阻塞的部分,都可以設置一個超時時間,超時后可以不再阻塞。

6. 使用CyclicBarrier

CyclicBarrier的情況和CountDownLatch有些類似:

public class Demo5 extends BaseDemo{ private CyclicBarrier cyclicBarrier = new CyclicBarrier(2); @Override public void callback(long response) { System.out.println('得到結果'); System.out.println(response); System.out.println('調用結束'); try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } public static void main(String[] args) { Demo5 demo5 = new Demo5(); demo5.call(); try { demo5.cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println('主線程內容'); }}

大家注意一下,CyclicBarrier和CountDownLatch僅僅只是類似,兩者還是有一定區(qū)別的。比如,一個可以理解為做加法,等到加到這個數字后一起運行;一個則是減法,減到0繼續(xù)運行。一個是可以重復計數的;另一個不可以等等等等。另外,使用CyclicBarrier的時候要注意兩點。第一點,初始化的時候,參數數字要設為2,因為異步調用這里是一個線程,而主線程是一個線程,兩個線程都await的時候才能繼續(xù)執(zhí)行,這也是和CountDownLatch區(qū)別的部分。第二點,也是關于初始化參數的數值的,和這里的demo無關,在平時編程的時候,需要比較小心,如果這個數值設置得很大,比線程池中的線程數都大,那么就很容易引起死鎖了。

總結

綜上,就是本次需要說的幾種方法了。事實上,所有的方法都是同一個原理,也就是在調用的線程中進行阻塞等待結果,而在回調中函數中進行阻塞狀態(tài)的解除。

以上就是Java異步調用轉同步的方法的詳細內容,更多關于Java異步調用轉同步的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩三级| 国产伦精品一区二区三区千人斩| 亚洲欧美视频一区二区三区| 成人羞羞视频播放网站| 亚洲综合色婷婷在线观看| 在线国产一区| 亚洲韩日在线| 91精品精品| 国产一区亚洲| 香蕉久久久久久久av网站| 欧美日韩少妇| 亚洲免费中文| 四虎精品永久免费| 欧美久久一区二区三区| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 乱一区二区av| 国产毛片一区二区三区| 国产精品免费大片| 国产精品115| 亚洲第一精品影视| 久久久久国产精品一区二区| 国产一区精品福利| 麻豆视频在线观看免费网站黄| 欧美91在线| 国产精品毛片一区二区在线看| 欧美黄页在线免费观看| 美女福利一区二区三区| 丝袜美腿诱惑一区二区三区 | 欧美在线不卡| 国产欧美日韩一区二区三区在线| 日韩av网站在线观看| 欧美日韩1区2区3区| 国产精品天堂蜜av在线播放| 麻豆91精品视频| 欧美影院三区| 蜜臀精品一区二区三区在线观看 | 日韩国产一区二| 视频在线在亚洲| 日韩高清电影免费| 欧美少妇精品| 免费人成黄页网站在线一区二区| 日韩精品一区二区三区中文| 国产精品多人| 久久男女视频| 日韩在线成人| 国产欧洲在线| 日av在线不卡| 国产精品二区不卡| 在线精品视频一区| 欧美激情国产在线| 亚洲精品影视| 三级小说欧洲区亚洲区| 亚洲一级在线| 欧美中文高清| 九一精品国产| 精品香蕉视频| 蜜桃视频在线观看一区| 激情久久一区二区| 天海翼亚洲一区二区三区| 青青青免费在线视频| 91欧美极品| 亚洲激情婷婷| 欧美激情aⅴ一区二区三区| 蜜臀国产一区| 91嫩草精品| 午夜久久av| 国产伦一区二区三区| 亚洲精品一区二区在线看| 精品国产亚洲日本| 国产91在线精品| 亚洲永久av| 久久麻豆精品| 亚洲精品一区二区妖精| 国产尤物精品| 一区二区三区国产在线| 国产乱码午夜在线视频| 天堂日韩电影| 欧美精品一区二区久久| 免费看av不卡| а√天堂8资源在线| 91精品国产乱码久久久久久久| 亚洲三级欧美| 国产91久久精品一区二区| 日韩中文影院| 亚洲精品婷婷| 久久久久99| 日韩欧美三区| 日韩不卡在线| 日韩av一区二区三区| 色88888久久久久久影院| 久久国产精品亚洲77777| 国产一区二区三区91| 日韩午夜高潮| 高清av一区| 日本伊人午夜精品| 欧美粗暴jizz性欧美20| 久久av资源| 久久国产精品毛片| 婷婷精品视频| 国产+成+人+亚洲欧洲在线| 日韩黄色av| 综合国产在线| 国产亚洲午夜| 亚州av乱码久久精品蜜桃| 一区二区三区四区日本视频| 国产麻豆一区| 日韩av在线免费观看不卡| 亚洲免费中文| 影音先锋国产精品| 久久精品国产www456c0m| 日韩欧美在线中字| 国产成人精品免费视| 91综合久久爱com| 久久午夜视频| 欧美午夜不卡| 午夜欧美精品| 999久久久91| 久久精品影视| 亚洲人成在线网站| 日韩久久视频| 亚洲最新无码中文字幕久久| 国产成人精品999在线观看| 精品九九在线| 久久久久久色| 亚洲精品大全| 亚洲2区在线| 日韩精品福利一区二区三区| 免费观看日韩电影| 天堂网在线观看国产精品| 久久九九精品| 亚洲精品中文字幕乱码| 亚洲激情婷婷| 综合激情一区| 日韩精品免费视频一区二区三区| 日韩精品乱码av一区二区| 日本在线成人| 91免费精品国偷自产在线在线| 国产欧美自拍| 国产精东传媒成人av电影| 欧美成人一二区| 国产一区二区三区四区五区| 欧美黑人巨大videos精品| 国产一区二区三区不卡av| 精品久久久久中文字幕小说| 国产一区二区三区不卡视频网站| 国产中文在线播放| 在线观看精品| 免费不卡中文字幕在线| 91精品婷婷色在线观看| 亚洲国产不卡| 亚洲综合色婷婷在线观看| 日韩一二三区在线观看| 欧美激情在线精品一区二区三区| 麻豆精品新av中文字幕| 麻豆一区二区在线| 美女av在线免费看| 免费观看不卡av| 亚洲精品四区| 日本成人在线不卡视频| 免费精品一区| 欧美成人基地| 中文日韩欧美| 亚洲一区二区三区在线免费| 日韩精品一区二区三区中文 | 91视频精品| 亚洲国产专区校园欧美| 免费精品视频最新在线| 国产精品亚洲综合久久| 欧美激情视频一区二区三区免费 | 夜夜精品视频| 日韩国产精品久久久久久亚洲| 国产日产精品一区二区三区四区的观看方式| 麻豆一区二区三区| 亚洲性图久久| 中文一区一区三区免费在线观 | 国产日本久久| 久久久久久色| 成人久久久久| 爽好久久久欧美精品| 久久国产精品色av免费看| 在线手机中文字幕| 模特精品在线| 久久精品三级| 国产精品丝袜xxxxxxx| 国产日韩视频| 在线成人动漫av| 日韩一区二区三区四区五区| 久久精品女人| 久久亚洲电影| 精品高清久久| 亚洲精品一级二级三级| 中文字幕在线看片| 涩涩涩久久久成人精品| 国产精品精品| 在线看片日韩| 中文在线免费视频| 亚洲欧洲美洲国产香蕉| 国产精品国产一区| 日韩在线成人| 国产亚洲一卡2卡3卡4卡新区|