这个程序其它都是正确的,就只有一点,必须把main方法中的myt3和inner变量声明为final的,否则就会产生local variable myt3 is accessed from within inner;needs to declared final编译错误,程序很简单,忘大家耐心!!public class Thread3
{
class Inner
{
private void m4t1 ( )
{
int i = 5;
while ( i -- > 0 )
{
System.out.println ( Thread.currentThread ( ).getName ( ) + " : Inner.m4t1 ( ) = " + i );
try
{
Thread.sleep ( 500 );
} catch ( InterruptedException ie )
{ }
}
} private void m4t2 ( )
{
int i = 5; while ( i-- > 0 )
{
System.out.println ( Thread.currentThread ( ).getName ( ) + " : Inner.m4t2 ( ) = " + i );
try
{
Thread.sleep ( 500 );
} catch ( InterruptedException ie )
{ }
}
}
} private void m4t1 ( Inner inner )
{
synchronized ( inner ) // 使用对象锁
{
inner.m4t1 ( );
}
} private void m4t2 ( Inner inner )
{
inner.m4t2 ( );
} private Inner createInner ( )
{
return new Inner ( );
} public static void main ( String [ ] args )
{
// local variable myt3 is accessed from within inner;needs to declared final
Thread3 myt3 = new Thread3 ( );
// local variable inner is accessed from within inner;needs to declared final
Inner inner = myt3.new Inner();
Thread t1 = new Thread ( new Runnable ( )
{
public void run ( )
{
myt3.m4t1 ( inner );
}
} , "t1" );
Thread t2 = new Thread ( new Runnable ( )
{
public void run ( )
{
myt3.m4t2 ( inner );
}
} , "t2" );
t1.start();
t2.start();
}
}
{
class Inner
{
private void m4t1 ( )
{
int i = 5;
while ( i -- > 0 )
{
System.out.println ( Thread.currentThread ( ).getName ( ) + " : Inner.m4t1 ( ) = " + i );
try
{
Thread.sleep ( 500 );
} catch ( InterruptedException ie )
{ }
}
} private void m4t2 ( )
{
int i = 5; while ( i-- > 0 )
{
System.out.println ( Thread.currentThread ( ).getName ( ) + " : Inner.m4t2 ( ) = " + i );
try
{
Thread.sleep ( 500 );
} catch ( InterruptedException ie )
{ }
}
}
} private void m4t1 ( Inner inner )
{
synchronized ( inner ) // 使用对象锁
{
inner.m4t1 ( );
}
} private void m4t2 ( Inner inner )
{
inner.m4t2 ( );
} private Inner createInner ( )
{
return new Inner ( );
} public static void main ( String [ ] args )
{
// local variable myt3 is accessed from within inner;needs to declared final
Thread3 myt3 = new Thread3 ( );
// local variable inner is accessed from within inner;needs to declared final
Inner inner = myt3.new Inner();
Thread t1 = new Thread ( new Runnable ( )
{
public void run ( )
{
myt3.m4t1 ( inner );
}
} , "t1" );
Thread t2 = new Thread ( new Runnable ( )
{
public void run ( )
{
myt3.m4t2 ( inner );
}
} , "t2" );
t1.start();
t2.start();
}
}
final Inner inner = myt3.new Inner();匿名内部类只能访问外部final对象
此是java的语法