private static void multiThreadedLocalPoolTest( final int cnt ) throws InterruptedException {
final Runnable task1 = new Runnable() {
@Override
public void run() {
final List<String> lst = new ArrayList<String>( 100 );
long start = System.currentTimeMillis();
for ( int i = 0; i < cnt; ++i )
{
final String str = Integer.toString( i );
final String interned = str.intern();
if ( str != interned )
System.out.println( "Thread 0: different interned " + str );
lst.add( interned );
if ( i % 1000000 == 0 )
{
System.out.println( "Thread 0 : " + i + "; time = " + ( System.currentTimeMillis() - start ) / 1000.0 + " sec" );
start = System.currentTimeMillis();
}
}
System.out.println( "Total length = " + lst.size() );
}
};
final Runnable task2 = new Runnable() {
@Override
public void run() {
final List<String> lst = new ArrayList<String>( 100 );
long start = System.currentTimeMillis();
for ( int i = 0; i < cnt; ++i )
{
final String str = Integer.toString( i );
final String interned = str.intern();
if ( str == interned )
System.out.println( "Thread 1: same interned " + str );
lst.add( interned );
if ( i % 1000000 == 0 )
{
System.out.println( "Thread 1 : " + i + "; time = " + ( System.currentTimeMillis() - start ) / 1000.0 + " sec" );
start = System.currentTimeMillis();
}
}
System.out.println( "Total length = " + lst.size() );
}
};
final Thread thread1 = new Thread( task1 );
thread1.start();
Thread.sleep( 2000 );
final Thread thread2 = new Thread( task2 );
thread2.start();}
本文介绍了一个使用两个线程进行本地池测试的例子。测试中,每个线程分别执行不同的任务,其中一个线程检查字符串的 intern 方法是否返回相同的对象引用,另一个线程则关注 intern 方法返回的新对象。通过对比两种情况下字符串的行为,可以观察到多线程环境下字符串池的运作情况。
760

被折叠的 条评论
为什么被折叠?



