首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Exchager 种两个线程之间交换数据

2012-11-14 
Exchager 类两个线程之间交换数据我们多线程之间有时候执行的时候要交换线程之间的数据,这样我们可以用的

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

?

?

其实从时间的运行时间来看是一样的,谁先完成工作,谁就会在等待的,并不是谁先完成工作了,马上就主动的进行数据的交换而是要等待大家都完成了工作了,才进行彼此的数据交换的

?

?

热点排行