【问题标题】:Java Thread: Please clarify this understandingJava Thread:请澄清这种理解
【发布时间】:2014-05-01 19:08:52
【问题描述】:
public class Qn {

    static class Friend {
        private final String name;

        public Friend(String name) {
            this.name = name;
        }

        public String getName() {
            return this.name;
        }

        // recipient - the person who greets
        public synchronized void sayHi(Friend recipient) {
            System.out.format("%s" + " said hi to %s %n",
                      this.name, recipient.getName());
        }
    }

    public static void main(String[] args) {
        final Friend john = new Friend("John");
        final Friend peter = new Friend("Peter");

        new Thread(new Runnable() {
            public void run() {
                john.sayHi(peter);
            }
        }, "thread1").start();
    }
}

问题:

如果理解正确,请澄清以下内容

  1. 在调用john.sayHi() 时,线程thread1 获得了内在的 锁定john 对象,以便访问john 对象的sayHi() 方法。

  2. 线程thread1在JVM中独立运行。

我在网上阅读了这些声明,不知道它们是什么意思! 【线程怎么可能在对象上运行!!! Infact 线程执行代码,对吗?]

  1. 线程 thread1 没有在 JVM 内的任何其他对象上运行。

  2. 线程永远不会在任何对象上运行。线程永远不会被对象执行。 一个线程永远不会在任何其他线程上运行。线程总是直接在 JVM 中运行。

【问题讨论】:

  • 静态类朋友{,类不能是静态的。
  • @Mr.Pandey 内部类当然可以是静态的
  • Re“在JVM中独立运行”。独立于什么?
  • @Mr.Pandey 你为什么这么认为?你听说过nested classes吗?
  • @user3580294:哎呀!是的,确实。

标签: java multithreading


【解决方案1】:

在调用john.sayHi()时,线程thread1已经获得john对象的内在锁,以便访问john对象的sayHi()方法。

更准确地说:

当调用john.sayHi() 时,线程thread1 将等待直到它可以在执行sayHi 之前获得john 上的锁。一旦获得锁,它将执行sayHi。当方法退出时,它会释放锁。

线程thread1在JVM中独立运行。

独立于什么?其他线程?是的,直到它尝试获得锁为止。此时,它可能会受到其他线程的阻碍。当它有锁时,它可以阻止其他线程。

线程 thread1 没有在 JVM 内的任何其他对象上运行。

线程在 CPU 上运行,而不是在对象上。

您是在问一个线程是否可以并行执行多个方法?如果是这样,答案是否定的。

线程永远不会在任何对象上运行。

线程在 CPU 上运行,而不是在对象上。

线程永远不会被对象执行。

线程不被任何东西执行。线程执行代码。

一个线程永远不会在任何其他线程上运行。

线程在 CPU 上运行,而不是线程。

线程总是直接在 JVM 中运行。

JVM 有一个虚拟 CPU,线程在其上运行。

【讨论】:

  • +1 非常感谢。非常感谢您付出这么多的努力。感谢您花时间让我理解。几乎所有的问题都得到了澄清。我有一个问题 - “直接在 JVM 中运行”。我认为线程在 JVM 中运行。我的理解是线程在 CPU 中运行,操作系统是调度程序。但是JVM对这些线程有一些控制吗?
  • 你说的是什么样的控制?对线程的唯一真正控制形式是它何时被调度,这由调度程序完成。这是一个操作系统功能(在这种情况下将由主机操作系统执行)。一台机器有内存并执行指令,就是这样。
  • (调度也可以在协作式多任务系统中的用户区完成,但 Java 使用抢占式多任务系统。)
  • 好的,清楚。事实上,当您提到线程在 CPU 上运行时。我很困惑 JVM 在 Java 线程上做了什么,因为我认为线程在 JVM 中运行。好的,所以 Java 线程在 JVM 上运行 [准确地说,它们运行在 JVM 中的虚拟 CPU 上]
【解决方案2】:
  1. 几乎。我会将“已获得”替换为“将尝试获得”。
  2. 不知道。请解释您所说的“独立运行”是什么意思。
  3. 与 2 相同,但我会尝试猜测 - 不,线程未绑定到任何对象,除了相关的 Thread 对象。
  4. 再说一次,如果我理解正确的话 - 所有部分的答案都是肯定的,除了关于 Thread 对象的评论。

【讨论】:

  • 2. “独立运行”。我的意思是说它在JVM中运行。但我现在知道这是一个不正确的陈述。谢谢+1
  • 所有Java线程都运行在JVM中,但是由OS调度器和JVM内部机制一起调度。不客气,很高兴为您提供帮助。
  • 感谢 Alexey Malev 最后的评论。更准确地说,让我引用@ikegami 的话“JVM 有一个虚拟 CPU,线程在其上运行。”
  • 我接受@ikegami 的回答,因为它更具描述性并解决了我所有的问题,我感谢您的努力,并承认您是第一个回答的人。
【解决方案3】:
  1. 它不会运行直到它获得了锁。
  2. 它是一个独立于主线程的执行线程,因此在不受束缚的意义上它是“独立的”。
  3. 线程由堆栈和指令指针表示。有一个 Thread 对象,线程没有“在它上面运行”。对象只是为它“保持状态”。
  4. 是的。

【讨论】:

  • 谢谢你的第三点,+1。 (4) 是正确的,但措辞完全不正确,并由@ikegami 澄清
【解决方案4】:

见下文

在调用 john.sayHi() 时,线程 thread1 获得了 john 对象的内在锁,以便访问 john 对象的 sayHi() 方法。

Ans -> 任何线程如果必须执行任何同步方法,那么它将获得锁。 对象锁还是类锁? 根据静态或非静态同步方法决定。 如果它是静态的,那么它会使用类锁,如果是非静态的,那么它会使用对象锁。

线程thread1在JVM中独立运行。

答案-> 如果线程不是守护进程,那么它将独立运行。但是如果线程是守护进程,那么它取决于它的父线程,如果父线程死了,它也会被终止。

线程 thread1 没有在 JVM 内的任何其他对象上运行。

答案-> 线程不会在任何对象上运行,实际上没有代码在任何对象上运行。毕竟对象持有执行的状态就是这样。

线程永远不会在任何对象上运行。线程永远不会被对象执行。一个线程永远不会在任何其他线程上运行。线程总是直接在 JVM 中运行。

Ans -> 100% true statement

如有任何其他疑问,请告诉我

【讨论】:

  • 谢谢你的第三点。是的,对,没有代码在任何对象上运行! +1 但我的第四点是语法不正确,@ikegami 很好地解释了
猜你喜欢
  • 2012-07-29
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2014-11-08
  • 1970-01-01
相关资源
最近更新 更多