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();
}
}
问题:
如果理解正确,请澄清以下内容
调用john.sayHi()
时,线程thread1
已获得内在的
锁定john
对象,以便访问sayHi()
对象的john
方法。
线程thread1
在JVM中独立运行。
我在网上阅读这些陈述,不确定它们是什么意思! [线程如何在对象上运行!!! Infact Threads执行代码,对吗?]
线程thread1
未在JVM内的任何其他对象上运行。
线程永远不会在任何对象上运行。线程永远不会被对象执行。 线程永远不会在任何其他线程上运行。线程总是直接在JVM中运行。
答案 0 :(得分:2)
Thread
对象。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)
答案 3 :(得分:1)
见下文
当调用john.sayHi()时,Thread thread1已经获取了john对象的内部锁,以便访问john对象的sayHi()方法。
Ans - >任何线程如果必须执行任何同步方法,那么它将获得锁定。 对象锁或类锁? 基于静态或非静态同步方法决定。 如果它是静态的,那么如果非静态则需要类锁定,然后进行对象锁定。
Thread thread1在JVM中独立运行。
Ans - > 如果线程不是deamon那么它将独立运行。但是如果线程是守护进程,那么它依赖于它的父线程,如果父进程死掉它也将被终止。
线程thread1未在JVM内的任何其他对象上运行。
Ans - > 线程不会在任何对象上运行,实际上没有代码在任何对象上运行。在所有对象都保持执行状态之后。
线程永远不会在任何对象上运行。线程永远不会被对象执行。线程永远不会在任何其他线程上运行。线程总是直接在JVM中运行。
Ans -> 100% true statement
让我知道任何其他疑问