我可以在线程内强制中断吗?

时间:2019-04-15 09:55:26

标签: java multithreading

我写了一个类,它通过网络发送一些内容。我有一个问题,因为文件发送在超过10小时后没有结束,我认为是因为连接中断。

我虽然将sender方法放入另一个线程,并尝试在超时后中断它(如果尚未结束)。但是问题出在内核类内部,我不能在其中放入查询以检查是否检查了Therad.isinterrupted。

我可以截断线程而不要求他通过中断方法终止吗?

谢谢你, 卢西奥·门奇

2 个答案:

答案 0 :(得分:0)

Thread.interrupt()立即中断线程

Thread.stop()已过时,并引发了不受支持的操作异常

来自Java文档:

许多使用stop的代码应该替换为仅修改某些变量以指示目标线程应停止运行的代码。目标线程应定期检查此变量,如果该变量指示要停止运行,则应按有序方式从其运行方法返回。如果目标线程等待很长时间(例如,在条件变量上),则应使用interrupt方法来中断等待。

答案 1 :(得分:0)

Socket在这种情况下,一种好的策略是关闭套接字连接本身,这将导致任何待处理的write操作中止并抛出SocketException

https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#close()

class FileTransfer
{
    protected Socket theSocket;

    //...
    public void sendFile() throws Exception
    {
         // ...
         theSocket = new Socket(...);
         // ...
    }

    public void abortTransfer() throws Exception
    {
        // This may be called from another thread so do not mark it as synchronized
        theSocket.close(); // At this point sendFile() with throw exception SocketException
    }
    // ...
}

可以肯定,您可能需要添加一些额外的棘手逻辑来以最通用的方式处理竞争条件(为清楚起见,我省略了它)。无论如何,整个想法很简单:从另一个线程关闭套接字,您将终止正在执行的write操作。