问题:我很想知道杀死在Java 1.2中作为后台线程运行的长期操作(让我们调用此线程WorkerThread
)的最佳实践。< / p>
具体来说,我正在为Blackberry设备开发一个应用程序,我建立了一个HTTP连接。大图:如果URL请求被转发到后台线程(WorkerThread
),则线程发出请求并使用回调返回结果。
现在存在一种情况,在连接时,数据连接但因任何原因(通过隧道驱动)存在,该连接不再存在。由于Blackberry设计架构的限制,实际连接会在超时固定为2分钟时挂起。因此,迫切需要杀死已经挂起相对(15秒)长时间的连接。
现在我当前的解决方案是在另一个线程中运行WorkerThread
(让我们调用这个新线程MonitorThead
)。 MonitorThread
启动WorkerThread
,睡眠1000毫秒,然后定期检查WorkerThread
是否仍然存在。如果15秒后WorkerThread仍处于活动状态,则MonitorThread会将WorkerThread置于睡眠状态并退出。这真的是最好的方法吗?
总之,下面是与问题相关的核心问题和关键限制因素。干杯!
如何成功杀死在特定操作中遇到的java后台线程?
跟进/修改
Neil Coffey建议我只是持有对连接对象的引用,而是在该对象上调用 close()。我目前正在研究这个......
答案 0 :(得分:2)
如何杀死一个线程是一个棘手的问题。无法保证能够停止或中断线程。但是,如果您采用当前的体系结构并在超时时,只需关闭流(而不是Connection),这将导致I / O异常发生在I / O中卡住的线程上。如果它不会导致IOException,那么它至少应该使读取或写入返回EOF。
请注意,关闭Connection无济于事,正如JavaDoc所说:
任何打开的流都会导致连接保持打开状态,直到 他们自己也被关闭了。
您必须关闭从Connection中派生的流。
答案 1 :(得分:1)
嗯,最好的做法通常是让连接关闭,然后让这种连接的后果通过线程,允许它干净地退出。
你是如何建立联系的?而不是等待它超时,你有什么机会迫使它关闭?你能抓住一些连接对象吗? Blackberry是否有其他命令可以执行以杀死给定的连接?
答案 2 :(得分:0)
我一直认为在原子事务中将标志传递给后台线程是让线程停止的最好方法。如果它暂停一段时间,就把它杀死。
好吧,再补充一点,如果你相信2分钟很长一段时间,那对你有好处。我让用户通过取消按钮来决定很长时间。