Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用套接字I/O阻塞操作中断/停止线程_Java_Multithreading_Sockets - Fatal编程技术网

Java 使用套接字I/O阻塞操作中断/停止线程

Java 使用套接字I/O阻塞操作中断/停止线程,java,multithreading,sockets,Java,Multithreading,Sockets,在我的服务器应用程序的某个时刻,我想停止一些正在执行I/O阻塞操作的线程 例如,其中一个具有以下run()方法: public void run() { System.out.println("GWsocket thread running"); int len; byte [] buffer = new byte[1500]; try { this.in = new DataInputStream(this.socket.getInputSt

在我的服务器应用程序的某个时刻,我想停止一些正在执行I/O阻塞操作的线程

例如,其中一个具有以下
run()
方法:

public void run() {
    System.out.println("GWsocket thread running");

    int len;
    byte [] buffer = new byte[1500];
    try {
        this.in  = new DataInputStream(this.socket.getInputStream());
        this.out = new DataOutputStream(this.socket.getOutputStream());
        running = true;

        while (running){
            len = in.read (buffer);
            if (len < 0)
                running = false;
            else
                parsepacket (buffer, len);
        }

    }catch (IOException ex) {
        System.out.println("GWsocket catch IOException: "+ex);
    }finally{
        try {
            System.out.println("Closing GWsocket");
            fireSocketClosure();
            in.close();
            out.close();
            socket.close();
        }catch (IOException ex) {
            System.out.println("GWsocket finally IOException: "+ex);
        }
    }
}
public void run(){
System.out.println(“GWsocket线程运行”);
内伦;
字节[]缓冲区=新字节[1500];
试一试{
this.in=新的DataInputStream(this.socket.getInputStream());
this.out=新的DataOutputStream(this.socket.getOutputStream());
运行=真;
(跑步时){
len=in.read(缓冲区);
if(len<0)
运行=错误;
其他的
解析数据包(缓冲区,len);
}
}捕获(IOEX异常){
System.out.println(“GWsocket捕获IOException:+ex”);
}最后{
试一试{
System.out.println(“关闭GWsocket”);
fireSocketClosure();
in.close();
out.close();
socket.close();
}捕获(IOEX异常){
System.out.println(“GWIOException:+ex”);
}
}
}
如果我想停止运行此代码的线程,我应该怎么做

它们显示了如何做(如何停止等待很长时间的线程(例如,等待输入)?),但我不理解它们的含义:

要使这项技术发挥作用,关键是任何方法 中断异常,不准备立即处理 重新声明异常。我们说的是重申,而不是重复, 因为不可能总是重新显示异常。如果 捕获InterruptedException的方法未声明为抛出 这个(选中的)异常,然后它应该使用 以下咒语:Thread.currentThread().interrupt()


谁能给我一些提示吗?非常感谢您提供一些代码示例。

您可以添加如下方法

public void close() throws IOException {
    this.socket.close();
}
任何阻塞IO操作都将抛出SocketException

您可能希望设置一个类似于
closed
的标志,您可以检查是否会引发异常

顺便说一句:你不能确定你会得到离散的数据包读。阅读所需内容并使用BufferedInputStream以提高效率要好得多。仅当您不需要解析内容(例如从套接字复制到文件)时才读取块


e、 g.您的读取可能只得到一个字节,或者得到一个数据包的结尾和另一个数据包的开头。

Peter Lawrey描述的解决方案,也可以看到是关闭套接字

使用nio,您还可以使用一个允许应用的


调用Thread对象的方法将抛出InterruptedException,这甚至会停止阻塞IO操作。

您好,谢谢您的回答。有时
len=in.read(缓冲区)给我一个IOException。。。可能是因为我使用的是
DataInputStream
而不是
BufferedInputStream
?用哪个流包装它没有什么区别。