Java多線程中的Exchanger應(yīng)用簡析
Exchanger簡析
Exchanger用于線程間進(jìn)行通信、數(shù)據(jù)交換。
Exchanger提供了一個(gè)同步點(diǎn)exchange方法,兩個(gè)線程調(diào)用exchange方法時(shí),無論調(diào)用時(shí)間先后,兩個(gè)線程會(huì)互相等到線程到達(dá)exchange方法調(diào)用點(diǎn),此時(shí)兩個(gè)線程可以交換數(shù)據(jù),將本線程產(chǎn)出數(shù)據(jù)傳遞給對方。
演示示例1
package com.securitit.serialize.juc; import java.util.concurrent.Exchanger; public class ExchangerTester { // Exchanger實(shí)例. private static final Exchanger<String> exchanger = new Exchanger<String>(); public static void main(String[] args) { // 模擬阻塞線程. new Thread(() -> { try { String wares = "紅燒肉"; System.out.println(Thread.currentThread().getName() + "商品方正在等待金錢方,使用貨物兌換為金錢."); Thread.sleep(2000); String money = exchanger.exchange(wares); System.out.println(Thread.currentThread().getName() + "商品方使用商品兌換了" + money); } catch (InterruptedException ex) { ex.printStackTrace(); } }).start(); // 模擬阻塞線程. new Thread(() -> { try { String money = "人民幣"; System.out.println(Thread.currentThread().getName() + "金錢方正在等待商品方,使用金錢購買食物."); Thread.sleep(4000); String wares = exchanger.exchange(money); System.out.println(Thread.currentThread().getName() + "金錢方使用金錢購買了" + wares); } catch (InterruptedException ex) { ex.printStackTrace(); } }).start(); } }
輸出結(jié)果:
Thread-0商品方正在等待金錢方,使用貨物兌換為金錢.
Thread-1金錢方正在等待商品方,使用金錢購買食物.
Thread-0商品方使用商品兌換了人民幣
Thread-1金錢方使用金錢購買了紅燒肉
從結(jié)果可以看出,線程Thread-0首先調(diào)用了exchange方法,等待線程Thread-1到達(dá)exchange方法。
當(dāng)線程Thread-0和Thread-1兩者都到達(dá)exchange方法時(shí),通過exchange進(jìn)行了數(shù)據(jù)交換。從結(jié)果可以看出,兩個(gè)都拿到了對方傳遞的數(shù)據(jù)。
演示示例2
接下來演示public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException;
package com.securitit.serialize.juc; import java.util.concurrent.Exchanger; import java.util.concurrent.TimeUnit; public class ExchangerTimeTester { // Exchanger實(shí)例. private static final Exchanger<String> exchanger = new Exchanger<String>(); public static void main(String[] args) { // 模擬阻塞線程. new Thread(() -> { try { String wares = "紅燒肉"; System.out.println(Thread.currentThread().getName() + "商品方正在等待金錢方,使用貨物兌換為金錢."); Thread.sleep(2000); String money = exchanger.exchange(wares, 1000, TimeUnit.MILLISECONDS); System.out.println(Thread.currentThread().getName() + "商品方使用商品兌換了" + money); } catch (Exception ex) { ex.printStackTrace(); } }).start(); // 模擬阻塞線程. new Thread(() -> { try { String money = "人民幣"; System.out.println(Thread.currentThread().getName() + "金錢方正在等待商品方,使用金錢購買食物."); Thread.sleep(4000); String wares = exchanger.exchange(money); System.out.println(Thread.currentThread().getName() + "金錢方使用金錢購買了" + wares); } catch (Exception ex) { ex.printStackTrace(); } }).start(); } }
輸出結(jié)果:
Thread-0商品方正在等待金錢方,使用貨物兌換為金錢.
Thread-1金錢方正在等待商品方,使用金錢購買食物.
java.util.concurrent.TimeoutException
at java.util.concurrent.Exchanger.exchange(Exchanger.java:626)
at com.securitit.serialize.juc.ExchangerTimeTester.lambda$0(ExchangerTimeTester.java:18)
at java.lang.Thread.run(Thread.java:748)
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException;
API中,若阻塞線程等待超過指定時(shí)間,則會(huì)拋出異常。
到此這篇關(guān)于Java多線程中的Exchanger應(yīng)用簡析的文章就介紹到這了,更多相關(guān)Exchanger簡析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例
ArrayBlockingQueue是一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,本文就來介紹一下java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存
本篇文章主要介紹了詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04SSH框架網(wǎng)上商城項(xiàng)目第21戰(zhàn)之詳解易寶支付的流程
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第21戰(zhàn)之易寶支付的流程,感興趣的小伙伴們可以參考一下2016-06-06詳解Java執(zhí)行g(shù)roovy腳本的兩種方式
這篇文章主要介紹了Java執(zhí)行g(shù)roovy腳本的兩種方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04