请参阅我的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完成 - 为什么?
答案 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)
您已连续完成两个同步:
doSomething()
doSomething()