欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程中的Exchanger應(yīng)用簡析

 更新時(shí)間:2023年12月01日 09:41:20   作者:securitit  
這篇文章主要介紹了Java多線程中的Exchanger應(yīng)用簡析,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ù)傳遞給對方,需要的朋友可以參考下

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)文章

最新評論