当前位置: 首页 > 面试题库 >

具有套接字I / O阻止操作的中断/停止线程

潘坚白
2023-03-14
问题内容

在服务器应用程序的某个时刻,我想停止一些正在执行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);
        }
    }
}

如果我想停止运行此代码的线程,该怎么办?

在这里,它们显示了操作方法(
如何停止等待较长时间(例如,输入)的线程? ),但是我不明白它们的含义:

为了使该技术起作用,至关重要的是,任何捕获中断异常并且不准备对其进行处理的方法都必须立即重新声明该异常。我们说重新声明而不是重新抛出,因为并非总是可能重新抛出异常。如果未声明捕获InterruptedException的方法引发此(检查的)异常,则它应使用以下提示“重新中断自身”:Thread.currentThread()。interrupt();

谁能给我一些提示吗?一些代码示例将不胜感激。


问题答案:

彼得·劳瑞(Peter Lawrey)描述并在此看到的解决方案是关闭插座。

使用nio,您还可以使用可中断的SocketChannel并允许应用Java的标准中断模型。

调用Thread对象的interrupt方法会引发InterruptedException,该异常甚至会停止您的阻塞IO操作。



 类似资料:
  • 问题内容: 就像标题所说的那样,我需要一种方法来停止或中断正在等待套接字输入的阻塞线程。 问题答案: Thread.interrupt()应该是您要寻找的方法。确保您的输入访问方法也检查InterruptedException和ClosedByInterruptException。 另请参阅Sun Concurrency Tutorial 中的相应页面,作为另一种解决方案的建议。

  • 现在我们知道如何在一个指定I/O调度器上来调度一个任务,我们可以修改storeBitmap()函数并再次检查StrictMode的不合规做法。为了这个例子,我们可以在新的blockingStoreBitmap()函数中重排代码。 private static void blockingStoreBitmap(Context context, Bitmap bitmap, String filena

  • 我在使用https域和https套接字io时收到此警告。 我的代码是这样的: 希望有答案来解决这个问题。我已经从其他人那里搜索过,但我申请时发现不起作用。

  • 阻塞I/O的操作会导致App必须等待结果返回(阻塞结束)才能进行下一步操作。在UI线程上执行一个阻塞操作会将UI强行卡住,直接造成很糟糕的用户体验。 我们激活StrictMode后,我们开始收到了关于我们的App错误操作磁盘I/O的不良信息。 D/StrictMode StrictMode policy violation; ~duration=998 ms: android.os.Strict

  • 问题内容: 我有一个执行以下代码的线程: 哪里是。如何才能优雅地停止此类线程?关闭或使用均无效。 问题答案: 这是因为读取System.in(InputStream)是一项阻塞操作。 在这里看是否可以从InputStream读取超时? 这是一种从System.in获取NIO FileChannel并使用超时检查数据可用性的方法,这是问题中所述问题的特例。在控制台上运行它,不要键入任何输入,然后等待

  • 我正在用C语言编写一个服务器,使用POSIX sockets api。 这是作为GUI应用程序的一部分运行的,它需要能够停止和启动服务器监听和向客户端发送数据。 服务器的主要部分基本上是这样的(我排除了很多代码,因为其中一些与这个问题无关。) 换句话说: 让套接字监听连接 为select()调用设置fds 使用stdin调用select(),所有连接客户端套接字,以及获取从GUI发送的任何数据的管