我有兩個線程使用相同的Object obj
,因爲我已經閱讀了obj
所做的每一項變化,所以Thread A
將因爲發生之前的關係而可見Thread B
。Java多線程沒有發生 - 之前的關係
我想要做的是相反的,改變Thread A
obj
未經Thread B
是可見的,但我不知道該怎麼做的線索。
我試圖創建一個在Thread B
ThreadLocal
,將其設置在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的電子郵件信息
請提供一個[mcve]。 – Persixty
所以你需要兩個不同的線程的兩個單獨的對象。或者你爲什麼想要有一個共享對象,但沒有更改對其他線程可見?與之相關的 –
與此無關。你基本上是修改不同線程的同一個對象/引用 –