java多线程设计模式全部源码:
类图
时序图
- Main.java
public class Main {
public static void main(String[] args) {
Host host = new Host();
//data1、data2、data3都是FutureData(即它的 content还没有生成)
final IData data1 = host.handleRequest(30, 'a');
final IData data2 = host.handleRequest(20, 'b');
final IData data3 = host.handleRequest(10, 'c');
new Thread() {
@Override
public void run() {
System.out.println(data1.getContent());
}
}.start();
new Thread() {
@Override
public void run() {
System.out.println(data2.getContent());
}
}.start();
new Thread() {
@Override
public void run() {
System.out.println(data3.getContent());
}
}.start();
}
}
Host.java
public class Host {
public IData handleRequest(final int count, final char ch) {
System.out.println(Thread.currentThread() +
" request " + count + " " + ch + " begin!");
//FutureData的content是从RealData取的
final FutureData futureData = new FutureData();
new Thread() {
@Override
public void run() {
//真正生产content的地方
RealData realData = new RealData(count, ch);
futureData.setData(realData);
}
}.start();
System.out.println(Thread.currentThread() +
" request " + count + " " + ch + " end!");
return futureData;
}
}
FutureData.java
public class FutureData implements IData {
private boolean mReady = false;
private IData mReadData;
public synchronized void setData(IData data) {
mReadData = data;
mReady = true;
notifyAll(); //唤醒的只是调用this.wait()的线程,而不是这个进程的所有线程!!
}
@Override
public synchronized String getContent() {
while(!mReady) {
try {
this.wait(); //只会被this.notify()或者this.notifyAll()唤醒,
//而不是该进程的其它线程唤醒
System.out.println(Thread.currentThread().getName() + "hahah");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return mReadData.getContent();
}
}
RealData.java
public class RealData implements IData {
private String mContent;
public RealData(int count, char ch) {
char [] buffer = new char[count];
for(int i = 0; i < count; ++i) {
buffer[i] = ch;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mContent = new String(buffer);
}
@Override
public String getContent() {
return mContent;
}
}
结果图
升级版(用了concurrent包下的FutureTask和Callable接口)
类图(升级版)
时序图(升级版)
Main.java、RealData.java、IData.java代码和上面版本的相同,所以这里就不贴代码了。
FutureData.java
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureData extends FutureTask<RealData> implements IData {
public FutureData(Callable<RealData> callable) {
super(callable);
}
private boolean mReady = false;
private IData mReadData;
@Override
public String getContent() {
String content = null;
try {
//get()可能会阻塞(直到上面的callable对象的call()执行完才会不阻塞)
content = get().getContent();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return content;
}
}
- Host.java
import java.util.concurrent.Callable;
public class Host {
public IData handleRequest(final int count, final char ch) {
System.out.println(Thread.currentThread() + " request " + count + " " + ch + " begin!");
final FutureData futureData = new FutureData(new Callable<RealData>() {
@Override
public RealData call() throws Exception {
return new RealData(count, ch);
}
});
new Thread(futureData).start();
System.out.println(Thread.currentThread() + " request " + count + " " + ch + " end!");
return futureData;
}
}