Exchager 类两个线程之间交换数据
我们多线程之间有时候执行的时候要交换线程之间的数据,这样我们可以用的是exchager这个类的。
?
默认的数据返回应该是boolean类型的,在定义这个对象的时候要进行泛型的指定。下面请看举例。
?
例子是学生和老师进行名片的交换。
场景设置:
新学期开始了,学生和老师碰面了,学生拿出名片的时间10秒,老师拿出名片的时间是20秒,然后交换名片,各自打印出来。
//学生线程类package endual;import java.util.concurrent.Exchanger;public class Student implements Runnable{private Exchanger<String> ex ;public Student(Exchanger<String> ex) {this.ex = ex ;}public void run() { String msg = "Student" ; System.out.println("我是学生,我现在的信息是:" + msg) ; try {Thread.sleep(10000) ;} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} try { msg = ex.exchange(msg) ; System.out.println("我是学生我现在的信息是 :" + msg) ; } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}?
?
?
老师的线程类
package endual;import java.util.concurrent.Exchanger;public class Teacher implements Runnable {private Exchanger<String> ex ;public Teacher(Exchanger<String> ex) {this.ex = ex ;}public void run() { String msg = "teacher" ; System.out.println("我是老师,我现在的信息是" + msg) ; try {Thread.sleep(20000) ;} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} try { msg = ex.exchange(msg) ; System.out.println("我是老师,我现在的信息是 :" + msg) ;} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}?
?
?
测试的类 用到了线程池的
package endual;import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Exchanger 表示的两个线程之间进行数据交换用的 * @author endual * */public class ExchangerApp {public static void main(String[] args) {ExecutorService es = Executors.newCachedThreadPool() ;Exchanger<String> ex = new Exchanger<String>() ; Thread t1 = new Thread(new Student(ex)) ; Thread t2 = new Thread(new Teacher(ex)) ; es.execute(t1) ; es.execute(t2) ;}}?
打印的结构是
我是学生,我现在的信息是:Student我是老师,我现在的信息是teacher我是老师,我现在的信息是 :Student我是学生我现在的信息是 :teacher
?
?
其实从时间的运行时间来看是一样的,谁先完成工作,谁就会在等待的,并不是谁先完成工作了,马上就主动的进行数据的交换而是要等待大家都完成了工作了,才进行彼此的数据交换的
?
?