我正在构建一个程序,该程序需要构建一些需要如此密集计算才能创建的对象,我最聪明的课程是将它们构建在自己的专用线程中,而主线程则不断研究其他事物,直到对象被需要。
所以我想创建一个专门用于在自己的线程中创建自定义对象的特殊类。像这样:
public abstract class DedicatedThreadBuilder<T> {
private T object;
public DedicatedThreadBuilder() {
DedicatedThread dt = new DedicatedThread(this);
dt.start();
}
private void setObject(T i) {
object = i;
}
protected abstract T constructObject();
public synchronized T getObject() {
return object;
}
private class DedicatedThread extends Thread {
private DedicatedThreadBuilder dtb;
public DedicatedThread(DedicatedThreadBuilder builder){
dtb = builder;
}
public void run() {
synchronized(dtb) {
dtb.setObject(dtb.constructObject());
}
}
}
}
我唯一担心的是,这种机制只有在主线程(即构造DedicatedThreadBuilder的线程)在DedicatedThreadBuilder构建完成之前具有同步锁时才能正常工作,因此会阻止DedicatedThread构建产品对象的尝试直到完成DedicatedThreadBuilder的构建。为什么?因为DedicatedThreadBuilder的子类无疑需要使用参数构造,所以需要将它们传递到它们自己的私有存储中,以便它们可以在constructObject()过程中使用。
例如
public class JellybeanStatisticBuilder extends DedicatedThreadBuilder<JellybeanStatistics> {
private int greens;
private int blacks;
private int yellows;
public JellybeanStatisticBuilder(int g, int b, int y) {
super();
greens = g;
blacks = b;
yellows = y;
}
protected JellybeanStatistics constructObject() {
return new JellybeanStatistics(greens, blacks, yellows);
}
}
这只有在对象被其他线程阻塞直到它完全构造之后才能正常工作。否则,DedicatedThread可能会在分配必要的变量之前尝试构建对象。
那么Java就是这样工作的吗?