java多线程之Exchanger

简介

java提供了一个同步工具类Exchanger,它允许在两个并发任务中交换数据。Exchanger允许在两个线程之间定义同步点,当两个线程到达同步点时可以交换数据,第一个线程的数据进入到第二个线程,第二个线程的数据进入第一个线程。先到达同步点的线程会等待另外一个线程,到达后完成数据交换。下面将举例只有一个生产者和一个消费者,这两个线程交换集合,那么生产者生产的数据交换到消费者,消费者交换空数据给生产者。

例子

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

public class Producer implements Runnable {

	private List<String> buffer;

	private final Exchanger<List<String>> exchanger;

	public Producer(Exchanger<List<String>> exchanger) {
		this.buffer = new ArrayList<String>();
		this.exchanger = exchanger;
	}

	@Override
	public void run() {
		int cycle = 1;
		for (int i = 0; i < 10; i++) {
			System.out.println("Producer cycle:" + cycle);
			
			//生产数据
			for (int j = 0; j < 10; j++) {
				String message = "message " + ((i * 10) + j);
				System.out.println("Producer Message:" + message);
				buffer.add(message);
			}
			
			//阻塞,等待另一个线程到达交换点(同步交换点)
			try {
				buffer = exchanger.exchange(buffer);
			} catch (Exception e) {
				e.printStackTrace();
			}

			System.out.println("Producer buffer  size:" + buffer.size());
			
			cycle++;
		}

	}

}

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

public class Consumer implements Runnable {

	private List<String> buffer;

	private final Exchanger<List<String>> exchanger;

	public Consumer(Exchanger<List<String>> exchanger) {
		this.buffer = new ArrayList<String>();
		this.exchanger = exchanger;
	}

	
	@Override
	public void run() {
		int cycle = 1;
		for (int i = 0; i < 10; i++) {
			System.out.println("Consumer cycle:" + cycle);

			//阻塞,等待另一个线程到达交换点(同步交换点)
			try {
				buffer = exchanger.exchange(buffer);
			} catch (Exception e) {
				e.printStackTrace();
			}

			System.out.println("Consumer buffer  size:" + buffer.size());
			
			for (int j = 0; j < 10; j++) {
				String message = buffer.get(0);
				System.out.println("Consumer:"+message);
				buffer.remove(0);
			}
			cycle++;
		}
	}

}

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

public class Main {

	public static void main(String[] args) {

		Exchanger<List<String>> exchanger = new Exchanger<List<String>>();
		
		Producer producer = new Producer(exchanger);
		Consumer consumer = new Consumer(exchanger);
		
		Thread producerThread = new Thread(producer);
		Thread consumerThread = new Thread(consumer);
		producerThread.start();
		consumerThread.start();
		
	}

}

结果

Consumer cycle:1
Producer cycle:1
Producer Message:message 0
Producer Message:message 1
Producer Message:message 2
Producer Message:message 3
Producer Message:message 4
Producer Message:message 5
Producer Message:message 6
Producer Message:message 7
Producer Message:message 8
Producer Message:message 9
Producer buffer  size:0
Producer cycle:2
Producer Message:message 10
Producer Message:message 11
Producer Message:message 12
Producer Message:message 13
Producer Message:message 14
Producer Message:message 15
Producer Message:message 16
Producer Message:message 17
Producer Message:message 18
Producer Message:message 19
Consumer buffer  size:10
Consumer:message 0
Consumer:message 1
Consumer:message 2
Consumer:message 3
Consumer:message 4
Consumer:message 5
Consumer:message 6
Consumer:message 7
Consumer:message 8
Consumer:message 9
Consumer cycle:2
Consumer buffer  size:10
Producer buffer  size:0
Producer cycle:3
Producer Message:message 20
Producer Message:message 21
Producer Message:message 22
Producer Message:message 23
Producer Message:message 24
Producer Message:message 25
Producer Message:message 26
Producer Message:message 27
Producer Message:message 28
Producer Message:message 29
Consumer:message 10
Consumer:message 11
Consumer:message 12
Consumer:message 13
Consumer:message 14
Consumer:message 15
Consumer:message 16
Consumer:message 17
Consumer:message 18
Consumer:message 19
Consumer cycle:3
Consumer buffer  size:10
Consumer:message 20
Consumer:message 21
Consumer:message 22
Consumer:message 23
Consumer:message 24
Consumer:message 25
Consumer:message 26
Consumer:message 27
Consumer:message 28
Consumer:message 29
Consumer cycle:4
Producer buffer  size:0
Producer cycle:4
Producer Message:message 30
Producer Message:message 31
Producer Message:message 32
Producer Message:message 33
Producer Message:message 34
Producer Message:message 35
Producer Message:message 36
Producer Message:message 37
Producer Message:message 38
Producer Message:message 39
Producer buffer  size:0
Consumer buffer  size:10
Consumer:message 30
Consumer:message 31
Consumer:message 32
Consumer:message 33
Consumer:message 34
Consumer:message 35
Consumer:message 36
Consumer:message 37
Consumer:message 38
Consumer:message 39
Consumer cycle:5
Producer cycle:5
Producer Message:message 40
Producer Message:message 41
Producer Message:message 42
Producer Message:message 43
Producer Message:message 44
Producer Message:message 45
Producer Message:message 46
Producer Message:message 47
Producer Message:message 48
Producer Message:message 49
Producer buffer  size:0
Producer cycle:6
Producer Message:message 50
Producer Message:message 51
Producer Message:message 52
Producer Message:message 53
Producer Message:message 54
Producer Message:message 55
Producer Message:message 56
Producer Message:message 57
Producer Message:message 58
Producer Message:message 59
Consumer buffer  size:10
Consumer:message 40
Consumer:message 41
Consumer:message 42
Consumer:message 43
Consumer:message 44
Consumer:message 45
Consumer:message 46
Consumer:message 47
Consumer:message 48
Consumer:message 49
Consumer cycle:6
Consumer buffer  size:10
Consumer:message 50
Consumer:message 51
Consumer:message 52
Consumer:message 53
Consumer:message 54
Consumer:message 55
Consumer:message 56
Consumer:message 57
Consumer:message 58
Consumer:message 59
Consumer cycle:7
Producer buffer  size:0
Producer cycle:7
Producer Message:message 60
Producer Message:message 61
Producer Message:message 62
Producer Message:message 63
Producer Message:message 64
Producer Message:message 65
Producer Message:message 66
Producer Message:message 67
Producer Message:message 68
Producer Message:message 69
Producer buffer  size:0
Producer cycle:8
Producer Message:message 70
Producer Message:message 71
Producer Message:message 72
Producer Message:message 73
Producer Message:message 74
Producer Message:message 75
Producer Message:message 76
Producer Message:message 77
Producer Message:message 78
Producer Message:message 79
Consumer buffer  size:10
Consumer:message 60
Consumer:message 61
Consumer:message 62
Consumer:message 63
Consumer:message 64
Consumer:message 65
Consumer:message 66
Consumer:message 67
Consumer:message 68
Consumer:message 69
Consumer cycle:8
Consumer buffer  size:10
Consumer:message 70
Consumer:message 71
Consumer:message 72
Consumer:message 73
Consumer:message 74
Consumer:message 75
Consumer:message 76
Consumer:message 77
Consumer:message 78
Consumer:message 79
Consumer cycle:9
Producer buffer  size:0
Producer cycle:9
Producer Message:message 80
Producer Message:message 81
Producer Message:message 82
Producer Message:message 83
Producer Message:message 84
Producer Message:message 85
Producer Message:message 86
Producer Message:message 87
Producer Message:message 88
Producer Message:message 89
Producer buffer  size:0
Producer cycle:10
Producer Message:message 90
Producer Message:message 91
Producer Message:message 92
Producer Message:message 93
Producer Message:message 94
Producer Message:message 95
Producer Message:message 96
Producer Message:message 97
Producer Message:message 98
Producer Message:message 99
Consumer buffer  size:10
Consumer:message 80
Consumer:message 81
Consumer:message 82
Consumer:message 83
Consumer:message 84
Consumer:message 85
Consumer:message 86
Consumer:message 87
Consumer:message 88
Consumer:message 89
Consumer cycle:10
Consumer buffer  size:10
Consumer:message 90
Consumer:message 91
Consumer:message 92
Consumer:message 93
Consumer:message 94
Consumer:message 95
Consumer:message 96
Consumer:message 97
Consumer:message 98
Consumer:message 99
Producer buffer  size:0




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值