0

我正在用 Java 编写一个多线程解决方案来连接两个系统 A 和 B。系统 A 是完全串行的,不是线程的,并且将提供数据以发送到系统 B。系统 B 同时异步接受来自多个源的数据时间。

我正在使用 ThreadPoolExecutor 来管理线程。我正在使用一个类 TP 的静态单例实例,它围绕着 ThreadPoolExecutor(也是静态的),因为系统 A 无法创建新对象,但它可以调用静态对象。

这是我卡住的地方。在全力以赴之前,我正在对设置进行一些非常基本的测试。我创建了两个测试类,T1 和 T2。这些类中的每一个都导入类 TP(创建静态单例的地方)。T1 将一些对象添加到 TP 队列,然后 T2 添加更多。

尽管 TP 对象被声明为静态,但看起来有两个版本并行运行。T2 提交到队列的对象在 T1 提交的对象全部执行完之前正在执行。此外,由于 T1 或 T2 都没有在 ThreadPoolExector 上调用 shutdown(),因此它们都挂起并且永远不会终止。

我如何创建一个线程的守护进程静态实例,只要我发送要处理的内容,即使是来自不同的 Java 可执行文件,它基本上都会唤醒?

4

3 回答 3

1

如果您正在运行两个单独的进程,那么您将拥有两个单独的类型和两个单独的实例,无论它是否是单例。

如果您希望两个不同的进程相互通信,则需要完全分别解决该问题。有许多不同的 IPC 机制可用 - 网络、命名管道(Java IIRC 中的棘手)、内存映射文件、一个简单的共享目录,其中一个进程将任务放置给另一个进程处理等。

也不清楚到底挂的是什么,或者你的线程池是如何配置的。如果问题确实是线程方面(而不是 IPC 方面),那么请发布一个简短但完整的程序来演示该问题。

于 2009-05-15T19:30:54.927 回答
0

如果线程池的大小大于 1,则不能保证所有 T1 对象都会被首先处理。

于 2009-05-15T19:30:44.990 回答
0

在我看来,您正在运行两个不同的“主”类,每个类都使用相同的静态单例类。在这种情况下,将创建两个单例实例——每个 JVM 中都有一个。

我认为您想要做的是将线程池封装在另一个进程中,该进程作为服务运行并公开 IPC 的某些机制,正如 Skeet 所评论的那样。一种常见的方法是公开一个 JMS 队列以接收来自不同生产者的请求,并让消费者(您的守护程序)将其接收到的请求分派到线程池进行处理。

要将此服务作为守护程序运行,您可以将其托管在容器中,或者如果您在 Windows 上运行,则可以使用Java Service Wrapper之类的东西。

于 2009-05-15T19:51:53.723 回答