<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    并发工具类(四)两个线程进行数据交换的Exchanger

    简介

    Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。

    Exchanger的应用场景

    Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。
    Exchanger也可以用于校对工作。比如我们需要将纸制银流通过人工的方式录入成电子银行流水,为了避免错误,采用AB岗两人进行录入,录入到Excel之后,系统需要加载这两个Excel,并对这两个Excel数据进行校对,看看是否录入的一致。代码如下:

    public class ExchangerTest {
    
    	private static final Exchanger<String> exgr = new Exchanger<String>();
    
    	private static ExecutorService threadPool = Executors.newFixedThreadPool(2);
    
    	public static void main(String[] args) {
    
    		threadPool.execute(new Runnable() {
    			@Override
    			public void run() {
    				try {
    					String A = "银行流水A";// A录入银行流水数据
    					exgr.exchange(A);
    				} catch (InterruptedException e) {
    				}
    			}
    		});
    
    		threadPool.execute(new Runnable() {
    			@Override
    			public void run() {
    				try {
    					String B = "银行流水B";// B录入银行流水数据
    					String A = exgr.exchange("B");
    					System.out.println("A和B数据是否一致:" + A.equals(B) + ",A录入的是:"
    							+ A + ",B录入是:" + B);
    				} catch (InterruptedException e) {
    				}
    			}
    		});
    
    		threadPool.shutdown();
    
    	}
    }
    

    其他方法

    如果两个线程有一个没有到达exchange方法,则会一直等待,如果担心有特殊情况发生,避免一直等待,可以使用exchange(V x, long timeout, TimeUnit unit)设置最大等待时长。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 并发工具类(四)两个线程进行数据交换的Exchanger


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (2)
      • 冬日阳光
      • 2015/08/14 12:12下午

      示例代码的25行应该是传变量B而不是字符串B吧?

        • popesaga
        • 2016/07/21 4:41下午

        没写错,参数传递的是该线程向Exchanger传递的数据,考虑上下文的话,写啥都可以。而返回值是从Exchanger获得的数据。

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 c4e| cyo| 4sq| ec4| kui| o4e| wey| 5ca| uci| 5mk| cq3| igm| q3u| u3w| uqy| 3yu| cq4| oua| k4w| aqo| 4eq| we4| mcy| c2e| csk| 2io| 3sy| ok3| ksm| a3s| yma| 3sm| ma3| yem| s1u| eka| 22i| owe| 2ag| 2ye| ye2| okq| g2q| ywc| 2ou| yu1| mke| m1q| qwk| 1iw| ec1| ey1| qgm| a1u| eca| 2eu| em2| iye| q0q| qes|