为什么在线程同步时WebMethods被阻止了?

时间:2012-04-30 06:12:07

标签: java multithreading web-services jax-ws synchronized-block

请参阅我的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被调用两次,第二次调用正在等待线程X完成 - 为什么?

4 个答案:

答案 0 :(得分:1)

两个线程的接缝在ClassA(ClassA.this)的实例上同步

你想要同步什么?

答案 1 :(得分:1)

问题是你已经同步了doSomething。这肯定会被删除,因为它会阻止您的Web服务中的多线程。对于内部同步块,我也会删除它并尝试使用single-Thread ThreadPool,以便一次执行一个作业。

    // 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以来可以使用

答案 2 :(得分:0)

由于某些原因,线程B正在等待线程A-X(由A发起的X)为
完成 - 任何想法为什么?我预计只有B-X(X由B发起)正在等待 锁定。

在方法webRequests中执行此代码部分之后:

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

预计该指令最有可能继续使用该方法的第二部分:

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

但它绝不会。 WHY:

因为正在执行代码的主线程不能再访问目标代码,即使是上述方法的剩余部分。因为以下内容拒绝访问此对象:

synchronized(ClassA.this) {

答案 3 :(得分:0)

您已连续完成两个同步:

  1. doSomething()
  2. doSomething()
  3. 中的主题