java - 如何杀死当前类创建的所有线程

标签 java multithreading

我是网络编程新手,我创建了一个 fork ClientProcess 的服务器类线程来服务每个客户端的连接。目前我有两个问题:

  1. 跟踪正在运行的线程
  2. 执行完成后关闭线程并关闭连接(本线程的主题)

对于问题一,我目前使用 Arraylist<ClientProcess>保存线程列表并调用 Thread.interrupt()在适当的时间。我知道java API包含一个类ThreadGroup应该执行此任务,但我不知道应该如何将线程添加到组中,或者当我调用 Thread.start() 时是否会自动发生。换句话说,我已经解决了这个问题,但如果有人知道更好的方法来执行此操作,我愿意实现一个。

对于第二个问题,我仍然不知道如何开始。我读过关于Thread.stop的文章由 Oracle 提供,但我不明白他们关于如何中断/停止线程的建议。作为引用,我的ClientProcess类看起来像这样:

public class ClientProcess extends Thread {
    private Socket clientConnection;

    /* class constructor, etc. */

    @Override
    public void run() {
        try (BufferedReader in = new BufferedReader(clientConnection.getInputStream());
             PrintWriter out = new PrintWriter(clientConnection.getOutputStream())) {
             while (in.hasNext()) { /* do stuff */ }
        } catch (InterruptedException e) {
             /* close connection, clean resources, etc. */
        }
    }
}

从文章中看来,我应该在类中存储对线程的引用(为什么?),并且当我想停止线程运行时,我应该将变量设置为 null ,然后在线程可能停止的任何地方检查 null 。我不认为我的线程有理由保留对自身的引用或必须检查它是否是 null与我需要在 run() 中执行的每一个分支语句。我愿意对代码进行完全重构(该项目仍处于早期阶段),但我只是在寻找任何人来为我指明正确的方向。

编辑:这个问题已经有一些答案,但我意识到我真正的问题与我问的有很大不同。我正在尝试学习现代的 Web 编程技术,我记得几年前我在一本 C++ Web 编程书中读到,多线程通常用于为客户端提供服务。在网上浏览了一下之后,我发现网络编程已经发展到满足需求,并且现在使用完全不同的范例。我真正应该问的是“如何创建一个可以异步处理任务的服务器”或“服务器/客户端架构的现代编程范式是什么?”之类的问题。这个问题的真正答案是,多线程不再被认为是易于处理的,并且我应该使用其他范例来解决这个问题。

最佳答案

如果进行引发中断异常的阻塞调用,则中​​断线程将导致中断异常。否则,您必须显式检查线程是否已被中断。您应该有一个执行者服务来开始您的类(class)。

ExecutorService executor = Executors.newFixedThreadPool(2);

然后提交任务:

Future<?> f = executor.submit( ()->{
    try (BufferedReader in = new BufferedReader(clientConnection.getInputStream());
         PrintWriter out = new PrintWriter(clientConnection.getOutputStream())) {
         while (in.hasNext()) { /* do stuff */ }
    } catch (InterruptedException e) {
        //try with resources takes care of the streams. 
        return;
    }
} );

然后,当您需要关闭时,您所要做的就是。

executor.shutdownNow();

那么您当前正在运行的任务将被中断。有具有更多功能的执行服务,您可以使用 future 来控制任务。

关于java - 如何杀死当前类创建的所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60088451/

相关文章:

java - 如何使用斯派克

Java:从文本文件读取约 2 亿条边到内存的最快方法?

multithreading - 在Linux上通过SSH运行多线程Perl脚本的问题

java vector 和线程安全

c++ - MFC C++ 在回调函数中编辑 Windows 控件

java - Java SE应用程序上带有C3P0的DEADLOCK

java - 使用AWS开发工具包v2将DynamoDB转换为Elasticsearch?

java - 如何检查 Android 设备上的 Google Play 游戏帐户是否可用?

java - TLS SMTP 邮件 Java 抛出 SSLHandShakeException

c# - 在上一个调用仍在进行时无法重新调用 BeginGetRequestStream/BeginGetResponse