Java 作为守护进程运行线程类

Java 作为守护进程运行线程类,java,multithreading,daemon,Java,Multithreading,Daemon,我正在用Java编写一个多线程解决方案来连接两个系统a和B。系统a完全是串行的,不是线程化的,并且将提供数据发送到系统B。系统B同时异步接收来自多个源的数据 我正在使用ThreadPoolExecutor来管理线程。我使用的是类TP的静态单例实例,它围绕ThreadPoolExecutor(也是静态的),因为system a不能创建新对象,但可以调用静态对象 这就是我被困的地方。在我全力以赴之前,我正在做一些非常基本的设置测试。我创建了两个测试类,T1和T2。这些类中的每一个都导入类TP(在这里

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

我正在使用ThreadPoolExecutor来管理线程。我使用的是类TP的静态单例实例,它围绕ThreadPoolExecutor(也是静态的),因为system a不能创建新对象,但可以调用静态对象

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

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


如何创建tread的守护进程静态实例,该实例在我发送要处理的内容时基本上会被唤醒,即使是来自不同的Java可执行文件?

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

如果运行两个单独的进程,然后你有两个独立的类型和两个独立的实例,不管它是否是单例

如果您想让两个不同的流程相互对话,则需要完全单独地解决该问题。有很多不同的IPC机制可用-网络、命名管道(来自Java IIRC的技巧)、内存映射文件、一个简单的共享目录,其中一个进程放置任务供另一个进程处理,等等


还不清楚挂起了什么,或者线程池是如何配置的。如果问题真的是线程端(而不是IPC端),那么请发布一个简短但完整的程序来演示问题。

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

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


要将此服务作为守护进程运行,您可以将其托管在容器中,或者如果您在Windows上运行,则可以使用类似的功能。

等等。。。这些“系统”是如何相互对话的?套接字?不,系统A将运行Java类并直接与它们接口,系统B通过HTTP侦听提要。基本上,我正在管理一组发送到Google提要的XML消息。我不介意对象的处理是否按顺序完成,但我确实需要它们按顺序开始处理。也就是说,如果我提交1、2、3,我希望1在3之前开始处理,但我不需要1在3开始之前完成处理。我应该提到我将ThreadPoolExecutor对象声明为静态。那么,这不应该被TP类的所有实例“共享”吗?来自Sun:声明中包含静态修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。类的每个实例都共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类实例的情况下操作类变量。它们在同一个进程中共享(当然,不一定,但我们暂时不使用类加载器)。如果你有两个不同的进程在运行,它们是完全分开的。啊,我明白了。在这种情况下,我在同一个执行进程(main等)中创建同一类的两个实例,但不是两个不同的进程。有道理。你是对的,这就是我运行测试的方式。我想我真的不需要守护进程,我只需要能够将对象添加到同一ThreadPoolExecutor池。我认为,如果我将ThreadPoolExecutor对象设置为静态,那么TP类的所有实例都将使用ThreadPoolExecutor的同一个实例。