使用SwingUtilities.invokeLater()时保留实例变量值

时间:2014-07-25 17:49:43

标签: java swing

我在定时器上执行以下代码。我的问题是,在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 ];

1 个答案:

答案 0 :(得分:1)

您的Runnable匿名实例实现了run方法。只有在执行run方法时,它才会读取成员变量mLatestBilletShopOrderNummLatestBilletItemNum的当前值,并执行方法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 
...