文档章节

exchange

这些年了1990
 这些年了1990
发布于 2016/04/18 18:09
字数 702
阅读 49
收藏 0
点赞 1
评论 0
import java.util.concurrent.locks.*
    private V item;    
   
    private int arrivalCount;   
    private V doExchange(V x, boolean timed, long nanos) throws InterruptedException, TimeoutException {
        lock.lock();        try {
            V other;            // If arrival count already at two, we must wait for
            // a previous pair to finish and reset the count;
            while (arrivalCount == 2) {                if (!timed)
                    taken.await();                else if (nanos > 0) 
                    nanos = taken.awaitNanos(nanos);                else 
                    throw new TimeoutException();
            }            int count = ++arrivalCount;            // If item is already waiting, replace it and signal other thread
            if (count == 2) { 
                other = item;
                item = x;
                taken.signal();                return other;
            }            // Otherwise, set item and wait for another thread to
            // replace it and signal us.

            item = x;
            InterruptedException interrupted = null;            try { 
                while (arrivalCount != 2) {                    if (!timed)
                        taken.await();                    else if (nanos > 0) 
                        nanos = taken.awaitNanos(nanos);                    else 
                        break; // timed out
                }
            } catch (InterruptedException ie) {
                interrupted = ie;
            }            // Get and reset item and count after the wait.
            // (We need to do this even if wait was aborted.)
            other = item;
            item = null;
            count = arrivalCount;
            arrivalCount = 0; 
            taken.signal();            
            // If the other thread replaced item, then we must
            // continue even if cancelled.
            if (count == 2) {                if (interrupted != null)
                    Thread.currentThread().interrupt();                return other;
            }            // If no one is waiting for us, we can back out
            if (interrupted != null) 
                throw interrupted;            else  // must be timeout
                throw new TimeoutException();
        } finally {
            lock.unlock();
        }
    }  
    public Exchanger() {
    }   
    public V exchange(V x) throws InterruptedException {        try {            return doExchange(x, false, 0);
        } catch (TimeoutException cannotHappen) { 
            throw new Error(cannotHappen);
        }
    }  
   
    public V exchange(V x, long timeout, TimeUnit unit) 
        throws InterruptedException, TimeoutException {        return doExchange(x, true, unit.toNanos(timeout));
    }

}
  • 以上为源码:

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

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

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

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

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

一个简单的例子

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;

/**
 * @Title: ExchangerTest
 * @Description: Test class for Exchanger
 * @Company: CSAIR
 * @Author: lixuanbin
 * @Creation: 2014年12月14日
 * @Version:1.0
 */
public class ExchangerTest {
    protected static final Logger log = Logger.getLogger(ExchangerTest.class);
    private static volatile boolean isDone = false;

    static class ExchangerProducer implements Runnable {
        private Exchanger<Integer> exchanger;
        private static int data = 1;
        ExchangerProducer(Exchanger<Integer> exchanger) {
            this.exchanger = exchanger;
        }

        @Override
        public void run() {
            while (!Thread.interrupted() && !isDone) {
                for (int i = 1; i <= 3; i++) {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                        data = i;
                        System.out.println("producer before: " + data);
                        data = exchanger.exchange(data);
                        System.out.println("producer after: " + data);
                    } catch (InterruptedException e) {
                        log.error(e, e);
                    }
                }
                isDone = true;
            }
        }
    }

    static class ExchangerConsumer implements Runnable {
        private Exchanger<Integer> exchanger;
        private static int data = 0;
        ExchangerConsumer(Exchanger<Integer> exchanger) {
            this.exchanger = exchanger;
        }

        @Override
        public void run() {
            while (!Thread.interrupted() && !isDone) {
                data = 0;
                System.out.println("consumer before : " + data);
                try {
                    TimeUnit.SECONDS.sleep(1);
                    data = exchanger.exchange(data);
                } catch (InterruptedException e) {
                    log.error(e, e);
                }
                System.out.println("consumer after : " + data);
            }
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        Exchanger<Integer> exchanger = new Exchanger<Integer>();
        ExchangerProducer producer = new ExchangerProducer(exchanger);
        ExchangerConsumer consumer = new ExchangerConsumer(exchanger);
        exec.execute(producer);
        exec.execute(consumer);
        exec.shutdown();
        try {
            exec.awaitTermination(30, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            log.error(e, e);
        }
    }
}


本文转载自:http://www.cnblogs.com/davidwang456/p/4179488.html

共有 人打赏支持
这些年了1990
粉丝 9
博文 50
码字总数 11621
作品 0
徐汇
程序员
Exchange 2007迁移Exchange 2010应该注意的13件事

1. Exchange 2007可以支持升级到Exchange 2010,但需要提前将Exchange 2007所有服务器环境升级至 SP2或以上版本。 2. Exchange 2007如果更新至SP2或以上版本,则建议按照以下顺序进行各角色的...

taotie_ksl
06/26
0
0
Exchange 2010 SP3正式发布提供下载

在去年年末,微软发布了全平台的2013版服务器系统,包括Lync、Exchange、SharePoint、Office Web Apps、Project Server以及客户端套件Office 2013。但是我们在评估Exchange 2013的时候会发现...

技术小胖子
2017/11/15
0
0
Exchange 2003 迁移至 Exchange 2010 完全攻略(一)

前言 现在Exchange Server 2003迁移到全新的Exchange Server 2010,是很多企业都关注的一件大事,由原先的架构能否顺利的迁移到全新的Exchange 2010架构是很多ITPro同仁所关注最多的。由于企...

日久不生情
2017/11/22
0
0
Exchange 2016 系统要求

摘要:在安装 Exchange 2016 之前,您的环境所需要的内容。 安装 Exchange 2016 之前,建议您查看本主题中的内容,以确保您的网络、硬件、软件、客户端和其他元素满足 Exchange 2016 的要求。...

lianggj
06/26
0
0
Microsoft Exchange Server 2010 可扮五角色 速度将会快70%

据外电报道,5月11日微软公司宣布,其即将推出的Exchange Server 2010在使用相同的数据库引擎情况下,阅读和书写电子邮件到磁盘的速度将能够比Exchange 2007快70%。 上个月,微软发布了公开...

taotie_ksl
06/26
0
0
安装Exchange 2013 CU18遇到的几个问题和解决方法

2017年9月16日Exchange 2013和Exchange 2016分别发布了更新版本,Exchange Server 2013 CU18和Exchange Server 2016 CU17。分别的下载地址为: Exchange 2013 cu18 https://www.microsoft.c......

jialt
2017/10/30
0
0
升级邮件系统后,如何删除企业里最后一台旧的Exchange 2000/2003

升级邮件系统后,如何删除企业里最后一台旧的Exchange 2000/2003 最近的项目,查到相关资料放在这里备忘 如何将最后一个旧版 Exchange Server 从组织中删除 已发表 2008年3月20日 19:35 作者 ...

技术小大人
2017/11/16
0
0
Exchange Server 2016安装部署系列一:Exchange 简述,环境需求及部署规划

Exchange Server 2016简述 MicrosoftExchange Server 2016 为 Exchange Server(提供电子邮件、日程安排和用于自定义协作与消息传送服务应用程序的工具的消息传送平台)引入了一组新技术、功...

Wish_亮
06/28
0
0
Exchange 混合部署—Exchange 2007安装配置

接下来我会写一下如何混合部署新旧版Exchange 以及它们之间的迁移,最后如何迁移至Office 365、Office 365 如何与企业内部Exchange协同工作 路线是:Exchange 2007安装配置 Exchange 2013安装...

阳光奋进
2014/07/10
0
0
Exchange 混合部署—Exchange 2007到Exchange 2013迁移

这一篇演示Exchange 2007到Exchange 2013 的邮箱迁移以及收发测试 客户端:Windows 7&IE8&Outlook 2013 服务器:Exchange 2007&2013 好的,下面开始配置Outlook,此过程中,User1属于旧服务器...

阳光奋进
2014/07/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CoreText进阶(七)-添加自定义View和对其

CoreText进阶(七)-添加自定义View和对其 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更多...

aron1992
16分钟前
0
0
Python爬虫 爬取百合网的女人们和男人们

学Python也有段时间了,目前学到了Python的类。个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇。 据书上说...

p柯西
28分钟前
0
0
在Java中,你真的会日期转换吗

1.什么是SimpleDateFormat 在java doc对SimpleDateFormat的解释如下: SimpleDateFormatis a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows fo......

Java小铺
36分钟前
0
0
Linux系统梳理---系统搭建(二):tomcat的安装和使用

上一章讲到JDK的安装使用,这一章主要记录下服务器tomcat的安装以及部署一个项目. 1.下载tomcat,这里下载的是apache-tomcat-8.5.32.tar.gz 2.创建文件夹,便于管理,和JDK一样,在usr目录下创建t...

勤奋的蚂蚁
47分钟前
0
0
ES15-聚合

1.Terms Aggregation 分组聚合 2.Filter Aggregation 过滤聚合

贾峰uk
48分钟前
0
0
【2018.07.19学习笔记】【linux高级知识 20.27-20.30】

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数

lgsxp
51分钟前
0
0
10.32/10.33 rsync通过服务同步~10.35 screen工具

通过服务的方式同步要编辑配置文件:[root@linux-xl ~]# vim /etc/rsyncd.confport=873log file=/var/log/rsync.logpid file=/var/run/rsyncd.pidaddress=192.168.43.21[tes...

洗香香
54分钟前
0
0
与女儿谈商业模式 (3):沃尔玛的成功模式

分类:与女儿谈商业模式 | 标签: 经济学 沃尔玛 陈志武 2007-05-10 09:09阅读(11279)评论(30) 与女儿谈商业模式 (3):沃尔玛的成功模式 陈志武 /文 沃尔玛(Wal-Mart)是另一个有意思的财...

祖冲之
今天
0
0
网页加载速度优化方法总结

1、减少请求 最大的性能漏洞就是一个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源,这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。 2、整合资源 对开发...

Jack088
今天
0
0
dubbo学习

https://blog.csdn.net/houshaolin/article/details/76408399

喵五郎
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部