java多线程之Exchanger

来源:互联网 发布:mac ntfs读写插件 免费 编辑:程序博客网 时间:2024/06/05 17:04

简介

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;}@Overridepublic 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;}@Overridepublic 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




0 0
原创粉丝点击