3
回答
如何在java中关闭正在阻塞的线程
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

我现在在servlet中开了一个线程来接收通过socket传回来的数据,当没有数据接收的时候该线程会阻塞在一个while语句中(length = in.read(dates);),为了程序的稳定和安全,想在前台页面中添加一个按钮通过调用servlet的方式来手动的关掉该线程,在网上搜了不少资料都没有很好的解决,请高手指点一下,说说思路即可,谢谢!!

举报
张爱国
发帖于7年前 3回/4K+阅
共有3个答案 最后回答: 7年前

看看这篇文章Why Are Thread.stop, Thread.suspend
文章里建议这样停止线程

private volatile Thread blinker;

    public void stop() {
        blinker = null;
    }

    public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

或者可以用Channel。从java1.4开始提供了一个接口InterruptibleChannel,实现了该接口的类可以使用Thread.interrupt()中断阻塞的I/O,我没怎么用过Java的Socket,不过刚才查过API发现Socket有个方法getChannel()返回SocketChannel,可以试一下用这个Channel

我测试了以下两种I/O操作,

BufferedReader in1 = new BufferedReader(
            new InputStreamReader(
            Channels.newInputStream(
            (new FileInputStream(FileDescriptor.in)).getChannel())));
BufferedReader in2 = new BufferedReader(
            new InputStreamReader(new FileInputStream(FileDescriptor.in)));

类似这样读取数据

while ((line = in.readLine()) != null) {
                System.out.println(line);
            }

当我分别调用in1和in2所在线程的interrupt()方法后,in1线程终止并关闭了reader,但in2仍然接收输入

顶部