4

JAX-WS Web サービスのコード例を参照してください。

@WebService
public class ClassA {

@WebMethod
public synchronized void doSomething() {
    new Thread(new Runnable() { // Thread X
        @Override
        public void run() {
            synchronized (ClassA.this) {
                // Do something which should be run in this separate
                // thread, but not twice at the same time
                try {
                    System.out.println("Thread X Start");
                    Thread.sleep(10000);
                    System.out.println("Thread X End");
                } catch (InterruptedException e) {
                }
            }
        }
    }).start();
}

}

WebMethod が 2 回呼び出された場合、2 番目の呼び出しはスレッド X が完了するのを待っています。なぜですか?

4

4 に答える 4

1

両方のスレッドのような継ぎ目は、ClassA(ClassA.this)のインスタンスで同期します

何を同期しますか?

于 2012-04-30T06:16:45.880 に答える
1

問題は、doSomething も同期していることです。これは、Web サービスでのマルチスレッド化を妨げるため、確実に削除する必要があります。内側の同期ブロックについても、それを削除し、単一スレッドの ThreadPoolを使用して、ジョブが一度に 1 つずつ実行されるようにします。

    // Initiate you thread pool and make sure it is unique
    ExecutorService service = Executors.newFixedThreadPool(1);

    ...
    // In your web method:
    Future<?> futureResult = service.submit(new Runnable()/or new Callable());
    // Using callable, you will get a Typed Future

    Object result = futureResult.get();// If you need to wait for the result of the runnable/callable.
    ...

これはJava 1.5以降で利用可能です

于 2012-04-30T07:09:21.893 に答える
0

いくつかの理由で、スレッドBはスレッドAX(XはAによって生成された)が
終了するのを待っています-理由は何ですか?BX(XはBから発信)だけがロックを待っていると思いました。

このコード部分がメソッドで実行された後webRequests

new Thread(new Runnable() { // Thread A
             doSomething();
         }).start();

命令は、メソッドの2番目の部分で続行される可能性が最も高いと予想されます。

new Thread(new Runnable() { // Thread B
             doSomething();
         }).start();

しかし、それはまったくありません。どうして?:

コードを実行しているメインスレッドは、メソッドの上記の残りの部分であっても、オブジェクトコードにアクセスできなくなるためです。次の理由により、このオブジェクトへのアクセスが拒否されたためです。

synchronized(ClassA.this) {
于 2012-04-30T06:44:35.980 に答える
0

連続して 2 つの同期を実行しました:

  1. doSomething()
  2. のスレッドdoSomething()
于 2012-04-30T07:17:59.987 に答える