我在定时器上执行以下代码。我的问题是,在mLatestBilletShopOrderNum
的事件调度线程上调用mLatestBilletItemNum
之前,实例变量retrieveLineItemResultsFromPCS()
和run()
的值是否可被最后2行代码覆盖。 1}}方法?如果是这样,那么解决方法是什么?我应该在调用final
之前将这些实例变量的值复制到SwingUtilities.invokeLater()
局部变量,并将这些变量传递给retrieveLineItemResultsFromPCS()
,如代码示例2中那样?
if ( ( lShopOrderNum[ 0 ] != mLatestBilletShopOrderNum ) ||
( lItemNum[ 0 ] != mLatestBilletItemNum ) )
{
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run()
{
retrieveLineItemResultsFromPCS( mLatestBilletShopOrderNum, mLatestBilletItemNum );
}
} );
}
mLatestBilletShopOrderNum = lShopOrderNum[ 0 ];
mLatestBilletItemNum = lItemNum[ 0 ];
代码示例2:
if ( ( lShopOrderNum[ 0 ] != mLatestBilletShopOrderNum ) ||
( lItemNum[ 0 ] != mLatestBilletItemNum ) )
{
final int lBilletShopOrderNum= mLatestBilletShopOrderNum;
final int lBilletItemNum= mLatestBilletItemNum;
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run()
{
retrieveLineItemResultsFromPCS( lBilletShopOrderNum, lBilletItemNum );
}
} );
}
mLatestBilletShopOrderNum = lShopOrderNum[ 0 ];
mLatestBilletItemNum = lItemNum[ 0 ];
答案 0 :(得分:1)
您的Runnable
匿名实例实现了run
方法。只有在执行run
方法时,它才会读取成员变量mLatestBilletShopOrderNum
和mLatestBilletItemNum
的当前值,并执行方法retrieveLineItemResultsFromPCS
。
因此,传递给retrieveLineItemResultsFromPCS
的参数值取决于执行run
方法的时间。
如果您需要retrieveLineItemResultsFromPCS
不受最后两行的影响,您应该使用第二种方法,使用最终的局部变量。
您可以通过将匿名实例保存在变量中并在更改实例变量之前和之后调用其run方法来向自己演示此行为:
...
Runnable runnable = new Runnable() {
@Override
public void run()
{
retrieveLineItemResultsFromPCS( mLatestBilletShopOrderNum, mLatestBilletItemNum );
}
}
runnable.run (); // will see the old values of mLatestBilletShopOrderNum and mLatestBilletItemNum
mLatestBilletShopOrderNum = lShopOrderNum[ 0 ];
mLatestBilletItemNum = lItemNum[ 0 ];
runnable.run (); // will see the new values of mLatestBilletShopOrderNum and mLatestBilletItemNum
...