有问题的方法使用
public class ReservationController extends BaseController { public void saveReservationMessage(){ if (flag) { new Thread() { public void run() { reservationService.sendMail(id,1, url, getI18N()); } }.start(); } } }
修改好的
public class ReservationController extends BaseController { public void saveReservationMessage(){ final Res i18N = getI18N(); if (flag) { new Thread() { public void run() { reservationService.sendMail(id,1, url, i18N); } }.start(); } } }
getI18N()
这个方法是主线程BaseController中的方法。
在saveReservationMessage()控制器中,我使用了一个线程发送邮件,在线程中,我有调用了主线程中的getI18N(),这样线程启动的顺序不一样,
如果我启动的线程在我没有拿到主线程中的getI18N()的时候,执行了的话,那么getI18N()的值,就会是空的。我会拿不到值的。
如果在线程中要拿到其他线程中的值的话,那么需要在这个线程启动之前拿到,这些值,然后使用这个值,这样的方式才可以拿到值,使用。否则,线程之间相互调用方法取值的话,会出现空指针问题的。
线程之间取值存在线程安全问题。不知道哪个线程先执行,哪个后执行,所以取值的时候就不确定了。
就好像:主线程做菜,做菜中有一处烧水方法准备着,现在做饭,我需要水,直接拿烧水的方法,但是这个方法准备好了,但是没有执行,水还没装,做饭新启动的线程就拿不到水的。
想要拿到水,需要在做饭之前,使用一下烧水的方法,这样,就有水了,我新启动做饭线程的时候,再拿水,就有了,就可以使用了