2017-10-17 47 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,它被用作子節點之間的單例。

希望這是有幫助的任何人都需要它(希望也正確寫入)