java多线程设计模式全部源码:
模式图
一般类图
下面例子的类图
项目架构图
Main.java
public class Main {
public static void main(String[] args) {
Data data = new Data(10);
new ReadThread(data).start();
new ReadThread(data).start();
new ReadThread(data).start();
new ReadThread(data).start();
new WriteThread(data, "abcdefghijklmnopqrstuvwxyz", 12345).start();
new WriteThread(data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 15545).start();
}
}
Data.java
public class Data {
char [] mBuffer;
ReadWriteLock mReadWriteLock = new ReadWriteLock(); //自定义的锁
public Data(int length) {//构造函数里面初始化参数
this.mBuffer = new char[length];
for(int i = 0; i < length; ++i) {
this.mBuffer[i] = '*';
}
}
public char[] read() throws InterruptedException {
try {
mReadWriteLock.readLock();
return doRead();
} finally {
mReadWriteLock.readUnlock();
}
}
public void write(char ch) throws InterruptedException {
try {
mReadWriteLock.wirteLock();
doWrite(ch);
} finally {
mReadWriteLock.writeUnlock();
}
}
private void doWrite(char ch) {
for(int i = 0; i < mBuffer.length; ++i) {
mBuffer[i] = ch;
}
slowly();
}
private char[] doRead() {
char newBuffer[] = new char[mBuffer.length];
for(int i = 0; i < mBuffer.length; ++i) {
newBuffer[i] = mBuffer[i];
}
slowly();
return newBuffer;
}
private void slowly() {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ReadWriteLock.java
public class ReadWriteLock {
private int mReadingReaders = 0; //正在调用read()的线程的个数
private int mWritingWriters = 0; //正在调用write()的线程的个数
private int mWaitingWriters = 0; //正在调用write()并且需要等待上一个正在执行完write()的线程的个数
private boolean mPreferWriter = true; //是否先写
public synchronized void readLock() throws InterruptedException {
while(mWritingWriters > 0 || (mPreferWriter && mWaitingWriters > 0)) {
wait();
}
mReadingReaders++;
}
public synchronized void readUnlock() {
mReadingReaders--;
mPreferWriter = true;
notifyAll();
}
public synchronized void wirteLock() throws InterruptedException {
mWaitingWriters++;
try {
while(mReadingReaders > 0 || mWritingWriters > 0) {
wait();
}
} finally {
mWaitingWriters--;
}
mWritingWriters++;
}
public synchronized void writeUnlock() {
mWritingWriters--;
mPreferWriter = false;
notifyAll();
}
}
ReadThread.java
public class ReadThread extends Thread {
private Data mData;
public ReadThread(Data data) {
this.mData = data;
}
public void run() {
try {
while(true) {
char [] buffer = mData.read();
System.out.println(Thread.currentThread().getName()
+ " reads " + String.valueOf(buffer));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
WriteThread.java
import java.util.Random;
public class WriteThread extends Thread {
private Random mRandom;
private Data mData;
private String mFilter;
private int mIndex = 0;
public WriteThread(Data mData, String mFilter, long seed) {
this.mRandom = new Random(seed);
this.mData = mData;
this.mFilter = mFilter;
}
public void run() {
try {
while(true) {
char ch;
ch = nextChar(); //取下一个字符
mData.write(ch);
Thread.sleep(mRandom.nextInt(2000)); //随机睡眠
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private char nextChar() {
char ch = mFilter.charAt(mIndex);
mIndex++;
if(mIndex >= mFilter.length()) {
mIndex = 0;
}
return ch;
}
}