原创转载请注明出处:http://agilestyle.iteye.com/blog/2343280
exchange()阻塞
Exchanger中的exchange()方法具有阻塞的特点,也就是此方法被调用后等待其他线程来取数据,如果没有其他线程来取数据,则一直阻塞等待。
ThreadA.java
package org.fool.java.concurrent.exchange;
import java.util.concurrent.Exchanger;
public class ThreadA implements Runnable {
private Exchanger<String> exchanger;
public ThreadA(Exchanger<String> exchanger) {
this.exchanger = exchanger;
}
@Override
public void run() {
try {
System.out.println(exchanger.exchange("data from Thread A"));
System.out.println("Thread A end...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ExchangerTest.java
package org.fool.java.concurrent.exchange;
import java.util.concurrent.Exchanger;
public class ExchangerTest {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
Thread thread = new Thread(new ThreadA(exchanger));
thread.start();
System.out.println("main end...");
}
}
Run
Note:
可以看到Console状态一直处于阻塞等待状态
exchange()传递数据
再创建一个ThreadB.java
package org.fool.java.concurrent.exchange;
import java.util.concurrent.Exchanger;
public class ThreadB implements Runnable {
private Exchanger<String> exchanger;
public ThreadB(Exchanger<String> exchanger) {
this.exchanger = exchanger;
}
@Override
public void run() {
try {
System.out.println(exchanger.exchange("data from Thread B"));
System.out.println("Thread B end...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
修改ExchangerTest.java
package org.fool.java.concurrent.exchange;
import java.util.concurrent.Exchanger;
public class ExchangerTest {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
Thread threadA = new Thread(new ThreadA(exchanger));
threadA.start();
Thread threadB = new Thread(new ThreadB(exchanger));
threadB.start();
System.out.println("main end...");
}
}
Run
exchange(V x, long timeout, TimeUnit unit)超时
调用exchange(V x, long timeout, TimeUnit unit)方法后,在指定的时间内没有其他线程获取数据,则出现超时异常。
ThreadC.java
package org.fool.java.concurrent.exchange;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class ThreadC implements Runnable {
private Exchanger<String> exchanger;
public ThreadC(Exchanger<String> exchanger) {
this.exchanger = exchanger;
}
@Override
public void run() {
try {
System.out.println(exchanger.exchange("data from Thread C", 5, TimeUnit.SECONDS));
System.out.println("Thread C end...");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
ExchangerTest2.java
package org.fool.java.concurrent.exchange;
import java.util.concurrent.Exchanger;
public class ExchangerTest2 {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
Thread threadC = new Thread(new ThreadC(exchanger));
threadC.start();
System.out.println("main end...");
}
}
Run