神奇好望角 The Magical Cape of Good Hope

庸人不必自扰,智者何需千虑?
posts - 26, comments - 50, trackbacks - 0, articles - 11
  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理

非主流并发工具之 Exchanger

Posted on 2011-12-27 10:50 蜀山兆孨龘 阅读(1510) 评论(0)  编辑  收藏 所属分类: Java SE

Exchanger 用来让两个线程互相等待并交换计算结果。这个类的用法很简单,因为它就定义了两个重载的 exchange 方法,参数多的那个无非增加了对超时的支持。当一个线程调用 exchange 的时候(以计算结果作为参数),它就开始等待另一个线程调用 exchange,然后两个线程分别收到对方调用 exchange 时传入的参数,从而完成了计算结果的交换。

不用太多的解释,运行下面这个例子就一清二楚:

final Exchanger<String> e = new Exchanger<>();

new Thread() {
    @Override
    public void run() {
        long id = Thread.currentThread().getId();
        String s = "abc";
        System.out.println("线程 [" + id + "] 算出 " + s);

        try {
            TimeUnit.SECONDS.sleep(new Random().nextInt(5));
            System.out.println("线程 [" + id + "] 收到 " + e.exchange(s));
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}.start();

new Thread() {
    @Override
    public void run() {
        long id = Thread.currentThread().getId();
        String s = "xyz";
        System.out.println("线程 [" + id + "] 算出 " + s);

        try {
            TimeUnit.SECONDS.sleep(new Random().nextInt(5));
            System.out.println("线程 [" + id + "] 收到 " + e.exchange(s));
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}.start();
    

运行结果(可能为):

线程 [9] 算出 abc
线程 [10] 算出 xyz
线程 [10] 收到 abc
线程 [9] 收到 xyz

最后强调下,该类只适用于两个线程,妄图用它来处理多个生产者和消费者之间的数据交换是注定要失败的……


只有注册用户登录后才能发表评论。


网站导航: