我是网络编程新手,我创建了一个 fork ClientProcess
的服务器类线程来服务每个客户端的连接。目前我有两个问题:
- 跟踪正在运行的线程
- 执行完成后关闭线程并关闭连接(本线程的主题)
对于问题一,我目前使用 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/