很直观,直接把两个线程数据调换过来了。可以根据运行结果,来进行查看。/**
* 2017-4-21
* author:饶为
* Administrator
*/
package Thread;
import java.util.concurrent.Exchanger;
/**
* 2017-4-21
* author:饶为
* Administrator
*/
public class ExchangerTest {
public static void main(String[] args) {
final Exchanger<String> exchanger = new Exchanger<String>();
new Thread(){
public void run(){
String a = "第一个线程";
try {
a = exchanger.exchange(a);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread1"+a);
}
}.start();
new Thread(){
public void run(){
String a = "第二个线程";
try {
a = exchanger.exchange(a);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread2"+a);
}
}.start();
}
}
运行结果如下/**
* 2017-4-21
* author:饶为
* Administrator
*/
package Thread;
import java.util.concurrent.Exchanger;
/**
* 2017-4-21
* author:饶为
* Administrator
*/
public class ExchangerTest {
public static void main(String[] args) {
final Exchanger<String> exchanger = new Exchanger<String>();
new Thread(){
public void run(){
String a = "第一个线程";
try {
a = exchanger.exchange(a);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread1"+a);
}
}.start();
new Thread(){
public void run(){
String a = "第二个线程";
try {
a = exchanger.exchange(a);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread2"+a);
}
}.start();
new Thread(){
public void run(){
String a = "第三个线程";
try {
a = exchanger.exchange(a);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread3"+a);
}
}.start();
new Thread(){
public void run(){
String a = "第四个线程";
try {
a = exchanger.exchange(a);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread4"+a);
}
}.start();
}
}

这里注意的就是getS这个方法,这个是用来传值的。/**
* 2017-4-21
* author:饶为
* Administrator
*/
package Thread;
/**
* 2017-4-21
* author:饶为
* Administrator
*/
public class Exchanger1 extends Thread {
String aString;
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
this.aString="我的线程1";
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getS(){
return aString;
}
}
讲讲这个join方法,这个其实是就是只有线程执行完后,才会运行下面的方法,它其实 join()方法的实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远等待。直到join线程完成后,线程的this.notifyAll()方法会被调用。ublic class ET {
public static void main(String[] args) throws InterruptedException {
exchanger.start();
countDownLatch.await();
Exchanger1 exchanger = new Exchanger1();
exchanger.start();
exchanger.join();
String a = exchanger.getS();
System.out.println(a);
}
}
这个是传出类。CountDownLatch,我之前的博文中已经介绍了它的使用方法,就是当cdl减少为0的时候,才会继续执行下面的代码,否则会阻塞。那么接收类代码为public class Exchanger1 extends Thread {
private CountDownLatch countDownLatch;
public Exchanger1(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
}
String aString;
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
this.aString="我的线程1";
try {
Thread.sleep(5000);
countDownLatch.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getS(){
return aString;
}
}
很明显,用await方法阻塞,当执行了countdown方法后,countdownlatch为0,则继续执行下面代码。活学活用之前学习的东西public class ET {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
Exchanger1 exchanger = new Exchanger1(countDownLatch);
exchanger.start();
countDownLatch.await();
String a = exchanger.getS();
System.out.println(a);
}
}
