2011-01-28 12 views
1

私は、単純なサーブレットを書いたが、要求が二つの異なるブラウザインスタンスから送信されたとき、私は13と28のような二つの異なるIDを取得し、サーバーログにシングルスレッドのアプリケーションGWTのRemoteServiceServletはシングルスレッドですか?

public class GreetingServiceImpl extends RemoteServiceServlet implements 
    GreetingService { 

private static int i = 0; 

public String greetServer(String input) { 

    if(i%2 == 0) { 
     try { 
      Thread.currentThread().sleep(10000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } else { 
     try { 
      Thread.currentThread().sleep(2000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

//System.out.println(this.getThreadLocalRequest().getSession().getId()); 

    System.out.println(Thread.currentThread().getId()); 
    return String.valueOf(i++); 
} 
} 

として動作しているようです。 10秒以上かかるたびに。

答えて

1

いいえ、シングルスレッドではありません。しかし、あなたはiを10秒経過した後にのみ増加させます。

したがって、Browser1がサービスi == 0を呼び出します。 => 10秒間スリープします。

次に、Browser2がこれらの10秒間にサービスを呼び出し、さらにi == 0を呼び出します。 =>も10秒間スリープします。

あなたが実際にシングルスレッドサーブレットのインスタンスを作成したい場合は、SingleThreadModelを使用することができます - だけインスタンスフィールド、ない静的フィールドに影響を与えています。

関連する問題