返回首页
当前位置: 主页 > 编程语言 > JAVA教程 >

java多线程之Exchanger类

时间:2013-11-30 03:13来源:电脑教程学习网 www.etwiki.cn 编辑:admin

Exchanger这个类,估计大家是很少用到,笔者最近在项目也用到这个类,在项目使用这个类来用于两个线程进行交换数据缓存,比如一个线程来读数据,另一个线程在写入缓存,在这两个线程中用Exchanger进行交换数据.接下来我写了一段代码来说明这个类的使用场景:

package com.thred;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Exchanger;

public class ExchangerTest {

public static void main(String[] args) {
Exchanger<List<String>> exchanger = new Exchanger<List<String>>();
new ReadThread(exchanger).start();// 启动读数据线程
new WriteThread(exchanger).start();// 启动写数据线程
}

}

class ReadThread extends Thread {
private Exchanger<List<String>> exchanger;
List<String> bufferList = new LinkedList<String>();
public static final Integer BUFFER_SIZE = 10;

public ReadThread(Exchanger<List<String>> exchanger) {
this.exchanger = exchanger;
}

@Override
public void run() {
System.out.println("ReadThread start");
for (int i = 0; i < BUFFER_SIZE; i++) {
bufferList.add(String.valueOf('A' + i)); // 模拟读数据
}
try {
Thread.sleep(10000);
bufferList = exchanger.exchange(bufferList);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ReadThread end");
}
}

class WriteThread extends Thread {
private Exchanger<List<String>> exchanger;
List<String> bufferList;

public WriteThread(Exchanger<List<String>> exchanger) {
this.exchanger = exchanger;
}

@Override
public void run() {
try {
System.out.println("WriteThread start");
bufferList = exchanger.exchange(bufferList); // 从Exchanger获得缓存数据
} catch (InterruptedException e) {
e.printStackTrace();
}
for (String str : bufferList) {
System.out.println(str);
}

System.out.println("WriteTread end");

}
}

从上面代码的运行结果可以看出,当启动读线程跟写线程的时候,在写线程调用exchanger.exchange(bufferList)的时候会发生阻塞直到有交换数据过来,使用Exchanger这个类比较适合在多线程环境中进行数据交换的场景.

顶一下
(1)
100%
踩一下
(0)
0%
标签(Tag):java java技巧 java实例教程 java源代码 java基础教程
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐内容