如何在java中关闭正在阻塞的线程

张爱国 发布于 2010/09/20 08:56
阅读 4K+
收藏 2

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

加载中
0
红薯
红薯

可以用线程的 destory 方法,但不推荐,应该自己通过一些标志位做好控制。

0
V
V

个人认为用AJAX传个标识位到后台,由后台类来具体实现

0
烈冰
烈冰

看看这篇文章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仍然接收输入

返回顶部
顶部