模式图
时序图
- Main.java
/**
*
* Main2.java用到的java文件如下:
* ProThread.java
* ConThread.java
* @author csx
*
*/
public class Main2 {
public static void main(String[] args) {
//Exchanger交换的是对象的引用
//ProThread.java和ConThread.java共用同一个Exchanger对象
Exchanger<char[]> exchanger = new Exchanger<>();
char[] buffer1 = new char[12];
new ProThread("producer thread ", exchanger, buffer1 ).start();
char[] buffer2 = new char[12];
new ConThread("consumer thread ", exchanger, buffer2 ).start();
}
}
ProThread.java
import java.util.Random;
import java.util.concurrent.Exchanger;
public class ProThread extends Thread {
Exchanger<char[]> mExchanger;
Random mRandom;
char[] mBuffer;
int mIndex = 0;
public ProThread(String name,Exchanger<char[]> mExchanger, char [] buffer) {
super(name);
this.mExchanger = mExchanger;
mRandom = new Random();
mBuffer = buffer;
}
public void run() {
while(true) {
System.out.print("pro:");
for(int i = 0; i < mBuffer.length; ++i) {
mBuffer[i] = nextChar();
System.out.print(mBuffer[i]);
}
System.out.println();
try {
System.out.println(Thread.currentThread().getName()
+ " before change : " + mBuffer);
//得到的是ConThread线程的buffer对象
mBuffer = mExchanger.exchange(mBuffer);
System.out.println(Thread.currentThread().getName()
+ " after change : " + mBuffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private char nextChar() {
char c = (char) ('A' + mIndex);
mIndex++;
try {
Thread.sleep(mRandom.nextInt(50));
} catch (InterruptedException e) {
e.printStackTrace();
}
return c;
}
}
ConThread.java
import java.util.Random;
import java.util.concurrent.Exchanger;
public class ConThread extends Thread {
Exchanger<char[]> mExchanger;
Random mRandom;
char[] mBuffer;
public ConThread(String name,Exchanger<char[]> mExchanger, char [] buffer) {
super(name);
this.mExchanger = mExchanger;
mRandom = new Random();
mBuffer = buffer;
}
public void run() {
while(true) {
try {
System.out.println(Thread.currentThread().getName()
+ " before change : " + mBuffer);
//得到的是ProThread线程的buffer对象
mBuffer = mExchanger.exchange(mBuffer);
System.out.println(Thread.currentThread().getName()
+ " after change : " + mBuffer);
System.out.print("consu:");
for(int i = 0; i < mBuffer.length; ++i) {
System.out.print(mBuffer[i]);
}
System.out.println();
Thread.sleep(mRandom.nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}