Java多线程代码行为
对于以下java代码:Java多线程代码行为,java,multithreading,Java,Multithreading,对于以下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 stati
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();
}
}
这段代码的一个可能结果是-输出可以是42(或者是4,2以外的其他线程id)。有人能解释一下这是怎么可能的吗?鉴于线程将在“Chess”类的不同实例上运行,“main”线程始终运行用户创建的线程,因此如何在此处打印不同的id,因为两个s.O.P语句都会立即打印id,并且只有这两个线程会调用move方法。在您的情况下,“主”线程负责运行,
新线程(ch).start()//线程-0
新线程(new Chess()).start()//线程-1
由于上述线程具有相同的优先级(默认情况下为5),ThreadScehduler将安排两个线程同时运行。因此,您可以获得两个不同线程的ID
您可以在Chess类上同步并运行线程,然后一次打印一个线程ID
您可以按如下方式应用类级锁定,并一次打印一个ID
public class Chess implements Runnable {
public void run() {
move(Thread.currentThread().getId());
}
synchronized static void move(long id) {
System.out.println(id + " ");
System.out.println(id + " ");
}
public static void main(String[] args) {
Chess ch = new Chess();
new Thread(ch).start();
new Thread(new Chess()).start();
}
}这并不奇怪
您正在创建两个线程,每个线程都有不同的id(在本例中分别为2和4)。您将打印这些id两次,因此每个id将打印两次
现在解释不同的数字和它们的出现
那订单呢?嗯,这就是线程的问题所在,它们是由处理器执行的,您无法控制每个处理器指令的执行顺序
PS:Chess的
实例数并不重要。如果您应将代码更改为:
没关系。我不明白你的问题。您启动了两个线程,每个线程都打印其ID两次,您想知道这两个ID是否都打印了两次?输出可能是这样的,因为来自两个线程的System.out.print
语句可能会交错。请尝试给出线程名称,以便您能够理解。我相信正如安迪·特纳所说,线程运行是交错的。所以线程Id:4执行,在move()完成之前,线程Id:2执行。main()例程创建两个新的thread
实例。Thread
类的构造函数保证每个实例都有自己的唯一ID。Thread.currentThread()
返回对运行调用它的代码的Thread
实例的引用。因此,调用Thread.currentThread().getId()
的两个不同线程会得到两个不同的数字,这一点也不奇怪。
Chess ch = new Chess();
new Thread(ch).start();
new Thread(ch).start();