将线程类作为守护程序运行

时间:2009-05-15 19:26:10

标签: java multithreading daemon

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

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

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

即使TP对象被声明为静态,看起来有两个版本在parallell中运行。 T2提交到队列的对象在T1提交的对象全部执行之前正在执行。此外,既然T1或T2都没有调用ThreadPoolExector上的shutdown(),它们都会挂起并永不终止。

如果我发送要处理的东西,即使是从不同的Java可执行文件中,我怎样才能创建一个基本唤醒的守护进程静态实例?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

如果线程池的大小大于1,则无法保证首先处理所有T1对象。

答案 2 :(得分:0)

听起来像你正在运行两个不同的'main'类,每个类都使用相同的静态单例类。在这种情况下,将创建两个单例实例 - 每个JVM中有一个实例。

我认为您要做的是将线程池封装在另一个作为服务运行的进程中,并在Skeet评论时公开IPC的某些机制。执行此操作的常见方法是公开JMS队列以接收来自不同生产者的请求,并让使用者(您的守护程序)将其接收的请求分派给线程池进行处理。

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