4

我有一个通过 JAX-WS 的 Web 服务问题。如果我在 web 方法中启动线程,它将在与客户端的连接结束时结束。

例子:

@WebMethod(operationName="test")
public boolean test()
{
  Thread th = new MyThread();
  th.start();
  // Thread is running
  ...
  return true;
  // Now thread th ends;
}

有什么解决方案可以保持线程运行吗?

4

2 回答 2

5

问题是您试图在 Java EE 应用服务器上启动线程。手动线程违反了 Java EE 规范,这就是您遇到问题的原因。在某些应用服务器上,您甚至根本无法启动单独的线程。从规范:

企业 bean 不得尝试管理线程。企业 bean 不得尝试启动、停止、挂起或恢复线程,或者更改线程的优先级或名称。企业 bean 不得试图管理线程组。这些功能是为 EJB 容器保留的。允许企业 bean 管理线程会降低容器正确管理运行时环境的能力。

如果您需要在单独的线程上完成工作,则需要使用应用服务器提供的工具进行异步工作。一些选项是将数据排队到 JMS 队列以供 MDB 处理,或者可能使用异步 ejb 请求(认为这是在 Java EE 6 中)。

于 2013-01-21T13:50:10.200 回答
0

如果您只是想在返回线程已完成之前确定 - 最简单的方法是 th.join()。此方法等待线程死亡。

于 2013-01-21T14:08:38.777 回答