【问题标题】:In Java if one thread got killed, what will happen to the other thread?在Java中,如果一个线程被杀死,另一个线程会发生什么?
【发布时间】:2011-11-18 09:38:37
【问题描述】:

我想知道Java:

  1. 如果主线程被杀死,其他子线程会怎样?
  2. 如果子线程被杀死,兄弟线程和父线程会怎样?

我在下面的链接中读到,由于线程共享地址空间,杀死一个线程也会影响另一个线程。

以下是here的引述。

线程是轻量级的进程,它将主控制流分成多个流,每个控制流/线程将独立执行。系统中进程的活动由线程表示。具有多个线程的进程称为多线程。每个线程都有自己的线程 ID(数据类型整数)、寄存器、程序计数器、堆栈、错误号。线程可以在同一进程中使用共享内存进行通信。 使用线程来管理和维护应用程序的子任务有不同的优点。当我们使用线程时,用于上下文切换的系统资源更少,并增加了应用程序的吞吐量。线程还简化了程序的结构。任务之间没有特殊的通信机制。 线程也有一些缺点,例如线程不可重用,因为它们依赖于进程并且不能与进程分离。线程不是孤立的,因为它们没有自己的地址空间。线程导致的错误可能会杀死整个进程或程序,因为该错误会影响该进程或程序中使用的所有线程的整个内存空间。由于在进程中由线程共享资源,当一个资源被线程损坏时,也会影响整个进程或程序。对于内存线程的并发读写访问将需要同步。进程的数据很容易通过数据竞争被线程损坏,因为进程中的所有线程都对同一条数据具有写访问权限。

你能告诉我上面链接中所说的是否适用于java

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    1) “子线程”不会发生任何事情...

    2) “兄弟线程”不会发生任何事情...

    ...除了以下例外:如果所有剩余线程都是守护线程,则应用程序将终止(即,当只剩下守护线程时,这些线程也将被杀死)。

    来自documentation of Thread

    [...] Java 虚拟机继续执行线程,直到发生以下任一情况:

    • Runtime 类的退出方法已被调用 [...]
    • 所有不是守护线程的线程都已死亡,要么从调用 run 方法返回,要么抛出传播到 run 方法之外的异常。

    【讨论】:

    • 感谢您的快速回复。我对第 2 点还有一个疑问。我在以下链接中读到,由于线程共享地址空间,杀死一个线程也会影响其他线程。等待您的回复blurtit.com/q236205.html
    • A) 说“线程也简化了程序的结构”的咆哮是完全错误的,它之后的任何陈述都无法修复那个悲惨的句子。 B) 我认为它不适用于 Java。 C) 不要显式地终止线程(通过使用 Thread.stop)。不推荐使用 Thread.stop 方法,原因非常充分。
    • 线程帮助程序同时管理不同的任务。不推荐使用 Thread.stop() 方法,因为它不安全(考虑线程是否正在管理一些重要数据)。最好在 run() 方法中使用布尔条件将其停止到 while 循环中。
    • @aioobe - 是的,链接对我来说也很糟糕。线程可以简化程序的结构(例如,通过消除在一个线程上异步处理事件时经常需要的状态机),但这绝对不是一般规则!
    【解决方案2】:

    在这两种情况下都没有。线程彼此独立运行,在这个意义上没有“父”或“子”线程之类的东西。该进程将继续运行,直到没有线程在其中运行。

    进程只是一个包含一些线程的容器。线程执行代码。如果一个进程容器内有一个或多个线程在运行,则该进程将继续存在。线程之间没有共生关系,杀死一个不会杀死另一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 2010-12-13
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多