我们正在寻找Java(在spring框架上下文中)的库/功能,用于在线程之间传递引用:
//ParentThread:
XXX.putSharedObject("lock", childLock);
XXX.putSharedObject("someKey", someObjectInstance);
for(i=0;i<X;i++) { taskExecutor.execute(context.getBean("childClass")); }
childLock.wait(xxx);
//ChildThread:
YY = XXX.getSharedObject("someKey");
YY.someFunction();
...some work...
XXX.getSharedObject("lock").notify();
这样,线程(ParentThread)在XXX中设置的任何引用只能由'ParentThread'及其中的任何子项访问,而不能访问其他'ParentThreads'或其子项。
这可能吗? (我相信Mapped Diagnostic Context在日志框架中的工作方式)
由于
答案 0 :(得分:1)
像这样工作(M. le Rutte的赞美):
//ParentRunnable:
public static final InheritableThreadLocal<SomeObjectType> YY = new InheritableThreadLocal<SomeObjectType>();
@Override
public void run() {
...
YY.set(someObjectInstance);
logger.debug("InParent: {}", YY.get());
for(i=0;i<X;i++) { taskExecutor.execute(context.getBean("childClass")); }
}
//ChildRunnable:
@Override
public void run() {
logger.debug("InChild: {}", ParentRunnable.YY.get());
}
很好的部分也是:
@Override
protected SomeObjectType initialValue()
可以在“set()”之前提前调用“get()”提示异常,或使用应用程序上下文获取原型bean,该bean用作子代之间的单例。
希望这对需要它的人有用(并且希望也能正确写出)
答案 1 :(得分:0)
使用同步类甚至块或方法可以通过线程安全来实现Java共享引用。这样,您可以在线程(Parent,child ...)之间共享给定对象,并保证线程安全。