2017-09-06 55 views
3

我有兩個線程使用相同的Object obj,因爲我已經閱讀了obj所做的每一項變化,所以Thread A將因爲發生之前的關係而可見Thread BJava多線程沒有發生 - 之前的關係

我想要做的是相反的,改變Thread Aobj未經Thread B是可見的,但我不知道該怎麼做的線索。

我試圖創建一個在Thread BThreadLocal,將其設置在run()方法,並在Thread B使用ThreadLocal.get()代替obj但它一直讀的變化。

有誰知道如何做到這一點?

預先感謝

編輯:(MVCE)

public class MyThreadLocal { 

    public static final ThreadLocal<Email> threadLocal = new ThreadLocal<Email>(); 

    public static void set(Email email) { 
     threadLocal.set(email); 
    } 

    public static void remove() { 
     threadLocal.remove(); 
    } 

    public static Email get() { 
     return threadLocal.get(); 
    } 
} 

主線

serviceEnvioTaskSpring.setThreadName(getIdInstanciaOrigen()); //serviceEnvioTaskSpring is an instance of a class which implements Runnable  

//set some more class' attributes 

serviceEnvioTaskSpring.setEmail(email); //email is the shared object 

ExecutorService threadExecutor = Executors.newCachedThreadPool(); 

threadExecutor.execute(serviceEnvioTaskSpring); 

threadExecutor.shutdown(); 

線程B

public void run() { 
    try { 

     //a few business logic lines 

     MyThreadLocal.set(email); 
     this.performTask(); 

    } catch (Exception e) { 
     logger.error("Error al lanzar thread asincrono: "+ e.getMessage()+" - "+e.getCause()); 
     e.printStackTrace(); 
    } 
} 

public void performTask() { 
    //do stuff in a for loop accessing email with MyThreadLocal.get();  
} 

這個問題時,我一直運行在主線程,因爲它的下一個步驟是刷新整個頁面,以便email被設置爲一個新的實例,這讓我失去MyThreadLocal的電子郵件信息

+4

請提供一個[mcve]。 – Persixty

+1

所以你需要兩個不同的線程的兩個單獨的對象。或者你爲什麼想要有一個共享對象,但沒有更改對其他線程可見?與之相關的 –

+0

與此無關。你基本上是修改不同線程的同一個對象/引用 –

回答

4

我必須使用同一目標的兩個線程發生obj,因爲我已經閱讀了由線程A在obj中所做的每一項更改,因此在線程B中,由於發生關係之前發生了這種情況。

這是不正確的。或者至少...這是不正確的,因爲你已經寫了它

現實情況是,一個之前發生關係,保證更新將是可見的。如果在之間沒有發生關係,則更改可能可見...或者它們可能不可見。

我想要做的是相反,在線程A中改變obj而不從線程B可見,但我不知道如何做到這一點。

基本上,你不能保證。如果兩個線程正在查看同一個對象,則無法停止一個線程查看另一個線程的更改。

使用線程局部變量沒有幫助。

如果你想一個線程看不到由其他線程的對象所做的更改,那麼你需要複製或克隆的對象,並有兩個線程使用不同的副本。


1 - (什麼你寫意味着其遺囑做出了改變總是是到B可見,因爲有一個之前發生關係但不一定是happens-。前關係!我就滿足,你可能沒有意味着 ...,但我不知道你不是故意的,這就是爲什麼我不是學究氣十足。)