gpt4 book ai didi

java - 构造函数是否同步直至完全完成?

转载 作者:行者123 更新时间:2023-11-30 01:59:59 25 4
gpt4 key购买 nike

我正在构建一个程序,需要构建一些需要如此密集的计算才能创建的对象,我最明智的做法是将它们构建在自己的专用线程中,而主线程则不断地处理其他事情,直到需要这些对象。

所以我考虑创建一个特殊的类,专门用于在自己的线程中创建自定义对象。就像这样:

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的子类无疑需要使用参数进行构造,因此需要将其传递到它们自己的私有(private)存储中,以便它们可以在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 的工作原理吗?

最佳答案

我认为你想要的是某种同步工厂类:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

public class SyncFactory<T> {
// alternatively, use newCachedThreadPool or newFixedThreadPool if you want to allow some degree of parallel construction
private ExecutorService executor = Executors.newSingleThreadExecutor();

public Future<T> create() {
return executor.submit(() -> {
return new T();
});
}
}

现在您将替换 T 的用法这可能需要在 T 之前发生已准备好 Future<T> ,并可以选择调用其 Future.get()方法阻塞直到准备好、设置超时或调用 Future.isDone()检查施工情况,不堵塞。此外,您可能希望让工厂在完成构造时调用回调或发布事件来通知主线程,而不是轮询 Future。

关于java - 构造函数是否同步直至完全完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53213866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com