简介
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
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