【问题标题】:Best Practice for killing a JavaME 1.2 thread?杀死 JavaME 1.2 线程的最佳实践?
【发布时间】:2009-05-08 02:07:17
【问题描述】:

问题:我很想知道在 Java 1.2 中终止作为后台线程运行的长期操作的最佳实践(让我们将此线程称为 WorkerThread)。

场景

具体来说,我正在为 Blackberry 设备开发一个应用程序,通过它建立 HTTP 连接。大图:如果将 URL 请求转发到后台线程 (WorkerThread),该线程会发出请求并使用回调返回结果。

场景详情

现在存在这样一种情况,即在连接时,存在数据连接但随后无论出于何种原因(通过隧道),该连接不再存在。由于 Blackberry 设计架构的限制,实际连接将挂起,因为超时固定为 2 分钟。因此,迫切需要终止已挂起相对较长时间(15 秒)的连接。

我目前的解决方案 - 2 条?

现在我当前的解决方案是在另一个线程中运行WorkerThread(我们称这个新线程为MonitorThead)。 MonitorThread 启动 WorkerThread,休眠 1000 毫秒,然后定期检查 WorkerThread 是否还活着。如果 15 秒后 WorkerThread 仍然存在,MonitorThread 将 WorkerThread 置于睡眠状态并退出。这真的是最好的方法吗?

问题总结及要点

总之,以下是与该问题相关的核心问题和关键限制。干杯!

如何成功杀死卡在特定操作中的 java 后台线程?

场景限制:

  • 无法控制操作暂停 并检查线程请求状态
  • 黑莓专用 Java ME 1.2 的实现及其 Thread API 所以没有明确的 kill() 方法
  • 最关心的最佳实践和如何 最安全地杀死一个保持线程。

跟进/编辑
Neil Coffey 建议我只保留对连接对象的引用,然后在该对象上调用 close()。我目前正在研究这个...

【问题讨论】:

    标签: multithreading blackberry java-me kill


    【解决方案1】:

    如何杀死线程是一个难题。没有保证能够停止或中断线程的方法。但是,如果您采用当前架构并且在超时时,只需关闭流(而不是 Connection),这将导致 I/O 异常发生在卡在 I/O 中的线程上。如果它不会导致 IOException,那么它至少应该导致读取或写入返回 EOF。

    请注意,关闭连接并没有帮助,正如 JavaDoc 所说:

    任何打开的流都会导致连接保持打开状态,直到 他们自己是封闭的。

    您必须关闭从连接派生的流。

    【讨论】:

    • 我从问题中了解到,发帖人的问题是他不能。
    • 是的,不幸的是我使用 HttpConnection 来建立我的连接,而不是套接字。在 Blackberry 的 API 中,他们决定不满足用户为 HttpConnection 指定的超时,但他们确实满足了用户为 Socket 连接指定的超时。不幸的是,我想使用 HTTP 协议附带的功能。
    • 我更新了我的答案。我有时会使用我在 JavaSE 中谈到的方法。也就是说,强制关闭套接字以强制所有挂起的 I/O 操作以 IOException 退出。
    • 谢谢艾迪。所以很可能我可以简单地调用 close() 因为它的方法之一可能在连接处于设置或连接状态时被调用(如 RIM HttpConnection API javadoc 中所述:blackberry.com/developers/docs/4.2api/javax/microedition/io/…
    【解决方案2】:

    嗯,最好的做法通常是关闭连接,然后让连接的后果波及线程,让它干净地退出。

    你是如何建立联系的?而不是等待它超时,你有什么机会强迫它关闭?你能得到一些连接对象吗?黑莓是否有其他命令可以执行来终止给定的连接?

    【讨论】:

    • 这是一个非常有趣的想法。现在我的 HttpConnection 请求被包装在一个静态方法中,我等待请求。也许如果我按照你说的做并保留对 HttpConnection 的引用并通过“MonitorThread”调用关闭,我可以干净地(或尽可能干净地)关闭连接。这个周末我会试试这个。谢谢!
    • 根据文档,关闭连接不会做任何事情。您必须关闭 Stream,而不是 Connection。
    【解决方案3】:

    我一直认为在原子事务中将标志传递给后台线程是要求线程停止的最佳方式。如果它没有停止一段时间,就杀死它。

    好吧,补充一点,如果您认为 2 分钟很长,那对您有好处。我会让用户决定什么是取消按钮的时间长。

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      相关资源
      最近更新 更多