2017-10-17 46 views
0

我们的线程之间传递引用寻找的Java库/功能(在Spring框架的上下文中)线程之间的引用:Java共享

//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(); 

使得XXX设置任何参考由一个线程( ParentThread)只能被'ParentThread'和它的任何孩子访问,而不能被其他'ParentThreads'或他们的孩子访问。

这可能吗? (我相信它怎么样的映射在日志框架诊断上下文工作)

感谢

+0

我最好的解析你的问题的能力,我想你可能会寻找['java.lang.ThreadLocal'(HTTPS: //docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html) –

+0

这不是每个线程本身吗?即,'ParentThread'定义的ThreadLocal变量可以被'ChildThread'访问,而不会每次都在构造函数中传递它? (在这种情况下,从spring上下文获取bean,并为所有引用调用“setter”?) –

+0

显然有一个['java.lang.InheritableThreadLocal'](https://docs.oracle.com/javase/ 7 /文档/ API /爪哇/郎/ InheritableThreadLocal.html)。 –

回答

0

Java共享引用可以用线程安全使用同步类,甚至是块或方法来实现。这样,您可以在线程(父,子...)之间共享给定对象,并保证线程安全。

+0

线程安全在这里不是问题(假设例如YY.someFunction();在这里是线程安全的),问题是避免为for循环内的每个loader加载调用setter,以及所有类型的线程需要共享一组常见的参考。 –

+0

再次,有点像MDC如何在日志库中工作(如Log4J) –

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()”,或者使用应用程序上下文来获取一个原型bean,它被用作子节点之间的单例。

希望这是有帮助的任何人都需要它(希望也正确写入)