2

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

设想

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

场景详情

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

我当前的解决方案 - 2 Theads?

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

问题总结及要点

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

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

场景限制:

  • 无法控制操作暂停并检查线程请求状态
  • 特定于 Blackberry 的 Java ME 1.2 实现及其 线程 API,因此没有显式 的kill()方法
  • 最关心的是最佳实践以及如何最安全地杀死持有线程。

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

4

3 回答 3

2

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

请注意,关闭 Connection 无济于事,正如 JavaDoc 所说:

任何打开的流都将导致连接保持打开状态,直到它们本身关闭。

您必须关闭从 Connection 派生的流。

于 2009-05-08T02:20:03.650 回答
1

好吧,最佳实践通常是关闭连接,然后让其后果波及线程,让它干净地退出。

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

于 2009-05-08T02:20:34.973 回答
0

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

好吧,除此之外,如果您认为 2 分钟很长,那对您有好处。我会让用户决定取消按钮的时间长。

于 2009-05-08T14:56:46.083 回答