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

对于以下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();
    }
}
这段代码的一个可能结果是-输出可以是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();