gpt4 book ai didi

java - 为什么在同步线程时 WebMethods 会被阻塞?

转载 作者:搜寻专家 更新时间:2023-11-01 03:27:16 24 4
gpt4 key购买 nike

请查看我的 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 完成 - 为什么?

最佳答案

问题是你已经同步了 doSomething。这绝对应该被删除,因为它会阻止您的 web 服务中的多线程。对于内部同步块(synchronized block),我也会将其删除并尝试使用 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 起可用

关于java - 为什么在同步线程时 WebMethods 会被阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10379245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com