Java线程:请澄清这种理解

时间:2014-05-01 19:08:53

标签: java multithreading

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对象,以便访问sayHi()对象的john方法。

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

  3. 我在网上阅读这些陈述,不确定它们是什么意思! [线程如何在对象上运行!!! Infact Threads执行代码,对吗?]

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

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

4 个答案:

答案 0 :(得分:2)

  1. 几乎。我取代"已经获得"与"将尝试获得"。
  2. 不知道。请解释你的意思"独立运行"。
  3. 与2相同,但我会尝试猜测 - 不,线程没有绑定到任何对象,除了相关的Thread对象。
  4. 同样,如果我理解正确 - 除了关于Thread对象的评论之外,所有部分的答案都是肯定的。

答案 1 :(得分:2)

  

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

更确切地说:

调用john.sayHi()时,线程thread1将等待,直到它在john上获取锁定,然后才执行sayHi。获得锁定后,它将执行sayHi。它将在方法退出时释放锁定。

  

线程thread1在JVM中独立运行。

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

  

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

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

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

  

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

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

  

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

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

  

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

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

  

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

JVM有一个运行该线程的虚拟CPU。

答案 2 :(得分:1)

  1. 直到获得锁定才会运行
  2. 它是一个独立的主线程执行线程,所以它是“独立的”,因为它没有被束缚。
  3. 线程由堆栈和指令指针表示。有一个Thread对象,线程没有“在它上面运行”。对象仅仅是“保持状态”。
  4. 真。

答案 3 :(得分:1)

见下文

当调用john.sayHi()时,Thread thread1已经获取了john对象的内部锁,以便访问john对象的sayHi()方法。

Ans - >任何线程如果必须执行任何同步方法,那么它将获得锁定。 对象锁或类锁? 基于静态或非静态同步方法决定。 如果它是静态的,那么如果非静态则需要类锁定,然后进行对象锁定。

Thread thread1在JVM中独立运行。

Ans - > 如果线程不是deamon那么它将独立运行。但是如果线程是守护进程,那么它依赖于它的父线程,如果父进程死掉它也将被终止。

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

Ans - > 线程不会在任何对象上运行,实际上没有代码在任何对象上运行。在所有对象都保持执行状态之后。

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

Ans -> 100% true statement

让我知道任何其他疑问