package com.abc.test
import org.junit.Test
import java.util.concurrent.Exchanger
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
class ExchangerTest {
private var pools: ExecutorService = Executors.newFixedThreadPool(10)
private val exchanger = Exchanger<Int>();
/**
Exchanger用于在多线程之间交换数据.
调用exchange()方法之后会一直阻塞到另外的线程来调用此对象的exchange()方法,
达到交换数据的目的
运行之后 ;第一个打印出200,第二个打印出100,
可以看到数据已经交换 。
此代码是用2个线程。
*/
@Test
fun testExchangerIn2Threads() {
pools.execute {
println("1 : " + exchanger.exchange(100))
}
pools.execute {
Thread.sleep(5000);
println("after sleep");
println("2 : " + exchanger.exchange(200))
}
pools.shutdown();
pools.awaitTermination(100, TimeUnit.SECONDS);
}
/**
此代码是用3个线程。
运行之后会发现有一个线程一直阻塞.
*/
@Test
fun testExchangerIn3Threads() {
pools.execute {
println("1 : " + exchanger.exchange(100))
}
pools.execute {
println("2 : " + exchanger.exchange(200))
}
pools.execute {
println("3 : " + exchanger.exchange(300))
}
pools.shutdown();
pools.awaitTermination(100, TimeUnit.SECONDS);
}
/**
此代码是用4个线程。
运行结果是2和3交换,1和4交换,
为什么呢?
*/
@Test
fun testExchangerIn4Threads() {
pools.execute {
Thread.sleep(5000);
println("1 : " + exchanger.exchange(100))
}
pools.execute {
println("2 : " + exchanger.exchange(200))
}
pools.execute {
println("3 : " + exchanger.exchange(300))
}
pools.execute {
println("4 : " + exchanger.exchange(400))
}
pools.shutdown();
pools.awaitTermination(100, TimeUnit.SECONDS);
}
}
java Exchanger 简单使用说明
最新推荐文章于 2024-01-10 22:39:38 发布