Java 最佳方法(线程、DBus 和 HttpRequest)

Posted

技术标签:

【中文标题】Java 最佳方法(线程、DBus 和 HttpRequest)【英文标题】:Java best approach (Threads, DBus and HttpRequest) 【发布时间】:2012-04-30 01:25:27 【问题描述】:

我在Java中有这种情况:

在名为 I 的内部模块上。 一个大模块 Z,通过 DBus 从 I 接收消息。 这个大模块 Z 与外部服务器 E 通信(对于 Dbus 收到的每条消息)。

通过 DBus 架构,每完成一个请求,在 Z 模块中都会创建一个新的线程来处理它。

与 E 交流的最佳方法是什么?

a) Make a class with a method SendToExternalServer(). this method will be called every time that have a new DBus message. 
  i) The method has only one HttpUrlConnection.
  ii) The method create a differente HttpUrlConnection instance every time is called.

b) Same situation on a) but now the method SendToExternalServer() is static
  i) (same situations)
  ii) (same situations)

c) Same situation on a) but the class extends the interface Runnable
  i) (same situation)
  ii) (same situation)


d) OTHER ?

提前致谢 若昂

【问题讨论】:

我不会为每个传入的事件创建一个新线程。而是使用一个使用线程池的事件调度程序(如 user949300 建议的执行程序)。 【参考方案1】:

我对 dbus 一无所知,所以对此持保留态度。

我会选择选项 B,仅仅是因为单元测试。使用选项 A(或 C),您可以切换到“MockSendToExternalServer”,它只记录或记录正在“发送”的消息,单元测试将查看这些消息。

我强烈倾向于选项 C,因为这样您就可以使用 java.util.concurrent ConcurrencyUtilities,例如 ExecutorService。对于您的第一遍实现,请使用简单的单线程队列(例如Executors.newSingleThreadedExecutor)但是,如果/当您需要更多线程时,您可以添加它们,例如Executors.newFixedThreadPool().

【讨论】:

问题是.. 选项 C 我必须为每个必须与外部服务器通信的方法创建一个类...这是不正确的,不是吗? 您可能会为每条消息创建一个 instance 的 Runnable。但是您也许可以使用同一个类来处理所有这些。 (这里我猜了一下,因为我根本不知道你的详细信息) 想象一下:我有一个类然后与外部服务器通信.. 它有几种方法,如:GetListOfCars(); GetListOfBikes(); GetListOfXPTO(); 如果方法真的那么相似,类可以在对应于 Cars、Bikes、XPTO 等的构造函数中采用 Enum(或 Class,或 SQL 查询字符串)。但它有更多花哨的东西继续,那么您可能需要为每个单独的课程。您可以通过使用单个工厂方法 getMyRunnable(args...) 返回适当的 Runnable 类来简化访问。因此,实现有多个类,但用户只需要了解工厂。

以上是关于Java 最佳方法(线程、DBus 和 HttpRequest)的主要内容,如果未能解决你的问题,请参考以下文章

DBUS——多线程处理

从 DBUS org.freedesktop.dbus 和 java 获取数据 - org.freedesktop.DBus$Error$UnknownMethod: 方法不存在

使用 dbus 调用 java 方法

Dbus/GLib 主循环,后台线程

在 Java 的并行线程中写入文件的最佳方法是啥?

Java 并发编程实战-创建和执行任务的最佳实践