我有两个线程使用相同的线程,并且由于之前发生的关系,我已经阅读了byObject obj
所做的每一个更改都将是可见的。obj
Thread A
Thread B
我想要做的是相反的,obj
在Thread A
不可见的情况下改变,Thread B
但我不知道如何做到这一点。
我尝试创建一个ThreadLocal
in Thread B
,将其设置在run()
方法中,并使用ThreadLocal.get()
而不是obj
inThread B
但它一直在读取更改。
有谁知道如何实现这一目标?
提前致谢
编辑:(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 的电子邮件信息