Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在线程之间共享引用_Java_Spring_Multithreading - Fatal编程技术网

Java在线程之间共享引用

Java在线程之间共享引用,java,spring,multithreading,Java,Spring,Multithreading,我们正在寻找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);

我们正在寻找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();
//父线程:
三十、 putSharedObject(“锁”,childLock);
三十、 putSharedObject(“someKey”,someObjectInstance);

对于(i=0;iJava共享引用可以通过使用同步类、甚至块或方法的线程安全性来实现。通过这种方式,您可以在线程(父线程、子线程…)之间共享给定对象,并保证线程安全。

按照以下方式解决(对的补充):

可以抛出异常以提示在“set()”之前过早调用“get()”,或者使用应用程序上下文获取原型bean,该原型bean用作子级之间的单例


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

以我解析您问题的最佳能力,我想您可能正在寻找的不是每个线程本身吗?即由“ParentThread”定义的ThreadLocal变量是否可以由“ChildThread”访问,而无需每次将其传递到构造函数中?(在本例中,从spring上下文获取一个bean,并为所有引用调用一个“setter”?)显然存在一个.InheritableThreadLocals可能确实有效…尝试它到目前为止仍然有效:父级将其定义为“public static final”,然后调用set(),子级调用ParentClass.XXX.get()它实现了期望的行为…请欣赏@M.leRutte(想添加答案吗?)这里的线程安全不是问题(假设例如YY.someFunction();这里是线程安全的),问题是避免为for循环中的每个加载程序以及需要共享一组公共引用的所有类型的线程调用setter
//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()