生活随笔
收集整理的這篇文章主要介紹了
同步器之Exchanger
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
類(lèi)java.util.concurrent.Exchanger提供了一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn),一對(duì)線(xiàn)程可以交換數(shù)據(jù)。每個(gè)線(xiàn)程通過(guò)exchange()方法的入口提供數(shù)據(jù)給他的伙伴線(xiàn)程,并接收他的伙伴線(xiàn)程提供的數(shù)據(jù),并返回。
當(dāng)在運(yùn)行不對(duì)稱(chēng)的活動(dòng)時(shí)很有用,比如當(dāng)一個(gè)線(xiàn)程填充了buffer,另一個(gè)線(xiàn)程從buffer中消費(fèi)數(shù)據(jù)的時(shí)候,這兩個(gè)線(xiàn)程可以用Exchanger來(lái)交換數(shù)據(jù)。當(dāng)兩個(gè)線(xiàn)程通過(guò)Exchanger交換數(shù)據(jù)的時(shí)候,這個(gè)交換對(duì)于兩個(gè)線(xiàn)程來(lái)說(shuō)是線(xiàn)程安全的。兩個(gè)線(xiàn)程都會(huì)等到自己的程序運(yùn)行到Exchanger這個(gè)地方時(shí),進(jìn)行等待。然后再進(jìn)行數(shù)據(jù)交換,交換完畢后,各自進(jìn)行以后的程序流程。
以下這個(gè)程序demo要做的事情就是生產(chǎn)者在交換前生產(chǎn)5個(gè)"生產(chǎn)者",然后再與消費(fèi)者交換5個(gè)數(shù)據(jù),然后再生產(chǎn)5個(gè)"交換后生產(chǎn)者",而消費(fèi)者要在交換前消費(fèi)5個(gè)"消費(fèi)者",然后再與生產(chǎn)者交換5個(gè)數(shù)據(jù),然后再消費(fèi)5個(gè)"交換后消費(fèi)者"。
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Exchanger;/*** 兩個(gè)線(xiàn)程間的數(shù)據(jù)交換**/
@SuppressWarnings("all"
)
public class ExchangerDemo {private static final Exchanger ex =
new Exchanger();class DataProducer
implements Runnable {private List list =
new ArrayList();public void run() {System.out.println("生產(chǎn)者開(kāi)始運(yùn)行"
);System.out.println("開(kāi)始生產(chǎn)數(shù)據(jù)"
);for (
int i = 1; i <= 5; i++
) {System.out.println("生產(chǎn)了第" + i + "個(gè)數(shù)據(jù),耗時(shí)1秒"
);list.add("生產(chǎn)者" +
i);try {Thread.sleep(1000
);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("生產(chǎn)數(shù)據(jù)結(jié)束"
);System.out.println("開(kāi)始與消費(fèi)者交換數(shù)據(jù)"
);try {// 將數(shù)據(jù)準(zhǔn)備用于交換,并返回消費(fèi)者的數(shù)據(jù)list =
(List) ex.exchange(list);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("結(jié)束與消費(fèi)者交換數(shù)據(jù)"
);System.out.println("生產(chǎn)者與消費(fèi)者交換數(shù)據(jù)后,再生產(chǎn)數(shù)據(jù)"
);for (
int i = 6; i < 10; i++
) {System.out.println("交換后生產(chǎn)了第" + i + "個(gè)數(shù)據(jù),耗時(shí)1秒"
);list.add("交換后生產(chǎn)者" +
i);try {Thread.sleep(1000
);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("開(kāi)始遍歷生產(chǎn)者交換后的數(shù)據(jù)"
);// 開(kāi)始遍歷生產(chǎn)者的數(shù)據(jù)for (Iterator iterator =
list.iterator(); iterator.hasNext();) {System.out.println(iterator.next());}}}class DataConsumer
implements Runnable {private List list =
new ArrayList();public void run() {System.out.println("消費(fèi)者開(kāi)始運(yùn)行"
);System.out.println("開(kāi)始消費(fèi)數(shù)據(jù)"
);for (
int i = 1; i <= 5; i++
) {System.out.println("消費(fèi)了第" + i + "個(gè)數(shù)據(jù)"
);// 消費(fèi)者產(chǎn)生數(shù)據(jù),后面交換的時(shí)候給生產(chǎn)者list.add("消費(fèi)者" +
i);}System.out.println("消費(fèi)數(shù)據(jù)結(jié)束"
);System.out.println("開(kāi)始與生產(chǎn)者交換數(shù)據(jù)"
);try {// 進(jìn)行數(shù)據(jù)交換,返回生產(chǎn)者的數(shù)據(jù)list =
(List) ex.exchange(list);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("消費(fèi)者與生產(chǎn)者交換數(shù)據(jù)后,再消費(fèi)數(shù)據(jù)"
);for (
int i = 6; i < 10; i++
) {System.out.println("交換后消費(fèi)了第" + i + "個(gè)數(shù)據(jù)"
);list.add("交換后消費(fèi)者" +
i);try {Thread.sleep(1000
);} catch (InterruptedException e) {e.printStackTrace();}}try {Thread.sleep(1000
);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("開(kāi)始遍歷消費(fèi)者交換后的數(shù)據(jù)"
); for (Iterator iterator =
list.iterator(); iterator.hasNext();) {System.out.println(iterator.next());}}}public static void main(String args[]) {ExchangerDemo et =
new ExchangerDemo();new Thread(et.
new DataProducer()).start();new Thread(et.
new DataConsumer()).start();}
} 運(yùn)行結(jié)果:
生產(chǎn)者開(kāi)始運(yùn)行
開(kāi)始生產(chǎn)數(shù)據(jù)
生產(chǎn)了第1個(gè)數(shù)據(jù),耗時(shí)1秒
消費(fèi)者開(kāi)始運(yùn)行
開(kāi)始消費(fèi)數(shù)據(jù)
消費(fèi)了第1個(gè)數(shù)據(jù)
消費(fèi)了第2個(gè)數(shù)據(jù)
消費(fèi)了第3個(gè)數(shù)據(jù)
消費(fèi)了第4個(gè)數(shù)據(jù)
消費(fèi)了第5個(gè)數(shù)據(jù)
消費(fèi)數(shù)據(jù)結(jié)束
開(kāi)始與生產(chǎn)者交換數(shù)據(jù)
生產(chǎn)了第2個(gè)數(shù)據(jù),耗時(shí)1秒
生產(chǎn)了第3個(gè)數(shù)據(jù),耗時(shí)1秒
生產(chǎn)了第4個(gè)數(shù)據(jù),耗時(shí)1秒
生產(chǎn)了第5個(gè)數(shù)據(jù),耗時(shí)1秒
生產(chǎn)數(shù)據(jù)結(jié)束
開(kāi)始與消費(fèi)者交換數(shù)據(jù)
結(jié)束與消費(fèi)者交換數(shù)據(jù)
生產(chǎn)者與消費(fèi)者交換數(shù)據(jù)后,再生產(chǎn)數(shù)據(jù)
交換后生產(chǎn)了第6個(gè)數(shù)據(jù),耗時(shí)1秒
消費(fèi)者與生產(chǎn)者交換數(shù)據(jù)后,再消費(fèi)數(shù)據(jù)
交換后消費(fèi)了第6個(gè)數(shù)據(jù)
交換后生產(chǎn)了第7個(gè)數(shù)據(jù),耗時(shí)1秒
交換后消費(fèi)了第7個(gè)數(shù)據(jù)
交換后消費(fèi)了第8個(gè)數(shù)據(jù)
交換后生產(chǎn)了第8個(gè)數(shù)據(jù),耗時(shí)1秒
交換后消費(fèi)了第9個(gè)數(shù)據(jù)
交換后生產(chǎn)了第9個(gè)數(shù)據(jù),耗時(shí)1秒
開(kāi)始遍歷生產(chǎn)者交換后的數(shù)據(jù)
消費(fèi)者1
消費(fèi)者2
消費(fèi)者3
消費(fèi)者4
消費(fèi)者5
交換后生產(chǎn)者6
交換后生產(chǎn)者7
交換后生產(chǎn)者8
交換后生產(chǎn)者9
開(kāi)始遍歷消費(fèi)者交換后的數(shù)據(jù)
生產(chǎn)者1
生產(chǎn)者2
生產(chǎn)者3
生產(chǎn)者4
生產(chǎn)者5
交換后消費(fèi)者6
交換后消費(fèi)者7
交換后消費(fèi)者8
交換后消費(fèi)者9 ?
轉(zhuǎn)載于:https://www.cnblogs.com/XL-Liang/archive/2012/06/14/2549504.html
總結(jié)
以上是生活随笔為你收集整理的同步器之Exchanger的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。