Exchanger的学习

发表时间:2017-09-07 16:43:36 浏览量( 29 ) 留言数( 0 )

学习目标:

1、了解Exchanger

2、在实践中灵活使用Exchanger


学习过程:

一、简介

    Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据。

当一个线程到达exchange调用点时,如果它的伙伴线程此前已经调用了此方法,那么它的伙伴会被调度唤醒并与之进行对象交换,然后各自返回。如果它的伙伴还没到达交换点,那么当前线程将会被挂起,直至伙伴线程到达——完成交换正常返回;或者当前线程被中断——抛出中断异常;又或者是等候超时——抛出超时异常。

    Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。

总结:

  • 此类提供对外的操作是同步的;

  • 用于成对出现的线程之间交换数据;

  • 可以视作双向的同步队列;

  • 可应用于基因算法、流水线设计等场景。


二、示例代码

HumanA类

public class HumanA extends Thread {
	Exchanger<String> exchanger = null;

	public HumanA(Exchanger<String> exchanger) {
		super();
		this.exchanger = exchanger;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			try {
				String name = exchanger.exchange("HumanAName"+i);
				System.out.println("HumanA="+name);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
}

HumanB类

public class HumanB extends Thread {  
  
    Exchanger<String> exchanger = null;  
    public HumanB(Exchanger<String> exchanger) {  
        super();  
        this.exchanger = exchanger;  
    }  
    @Override  
    public void run() {  
        Random rand = new Random();  
        for(int i=0; i<10; i++) {   
            try {  
                String name = exchanger.exchange("HumanBName"+i);
                System.out.println("HumanB="+name);
            } catch (InterruptedException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
    }  
}

测试类

public class TestExchange {

	public static void main(String[] args) {
		Exchanger<String> exchanger = new Exchanger<String>();
		
		new HumanA(exchanger).start();
		
		new HumanB(exchanger).start();
		
	}

}

结果 ,HumanA和HumanB可以互相交换数据了。

HumanA=HumanBName0

HumanB=HumanAName0

HumanB=HumanAName1

HumanA=HumanBName1

HumanA=HumanBName2

HumanB=HumanAName2

HumanB=HumanAName3

HumanA=HumanBName3

HumanA=HumanBName4

HumanB=HumanAName4

HumanB=HumanAName5

HumanA=HumanBName5

HumanA=HumanBName6

HumanB=HumanAName6

HumanB=HumanAName7

HumanA=HumanBName7

HumanA=HumanBName8

HumanB=HumanAName8

HumanB=HumanAName9

HumanA=HumanBName9