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

发布于 2021-11-15 04:06:42 字数 182 浏览 839 评论 3

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦中楼上月下 2021-11-16 01:37:50

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

奢华的一滴泪 2021-11-16 00:33:39

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

飘过的浮云 2021-11-15 17:12:42

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文