【发布时间】:2017-11-21 09:21:51
【问题描述】:
对于下面的java代码:
public class Chess implements Runnable {
public void run() {
move(Thread.currentThread().getId());
}
void move(long id) {
System.out.print(id + " ");
System.out.print(id + " ");
}
public static void main(String[] args) {
Chess ch = new Chess();
new Thread(ch).start();
new Thread(new Chess()).start();
}
}
此代码的一个可能结果是 - 输出可能是 4 2 4 2(或者是 4、2 以外的其他线程 ID)。有人可以解释一下这是怎么可能的吗?鉴于线程将在“Chess”类的不同实例上运行,我们如何在此处打印不同的 id,因为两个 S.O.P 语句都立即打印 id,并且只有这两个线程会调用 move 方法
【问题讨论】:
-
我不明白你的问题。您启动了两个线程,每个线程都打印其 ID 两次,您想知道这两个 ID 中的每一个都可能打印两次吗?
-
输出可能是因为来自两个线程的
System.out.print语句可能交错。 -
尝试给线程名称,以便您理解。我相信正如安迪·特纳所说,线程交错运行。所以线程 ID: 4 执行,并且在 move() 完成之前,线程 id:2 执行。
-
您的 main() 例程创建了两个新的
Thread实例。Thread类的构造函数保证每个实例都有自己的唯一 ID。Thread.currentThread()返回对运行调用它的代码的Thread实例的引用。因此,调用Thread.currentThread().getId()的两个不同线程会得到两个不同的数字也就不足为奇了。
标签: java multithreading