为什么我在这个java Thread程序中获得此输出?

May*_*ari 4 java multithreading

您好我是java编程的初学者,最近我正在学习Threads,我在这个程序的输出中遇到问题.

class s1 implements Runnable 
{ 
    int x = 0, y = 0; 
    int addX() {x++; return x;} 
    int addY() {y++; return y;} 
    public void run() { 
        for(int i = 0; i < 10; i++){ 
            System.out.println(addX() + " " + addY()); 
        }
    } 
    public static void main(String args[]) 
    { 
        s1 run1 = new s1(); 
        s1 run2 = new s1(); 
        Thread t1 = new Thread(run1); 
        Thread t2 = new Thread(run2); 
        t1.start(); 
        t2.start(); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出,

1 1 2 2 1 1 3 3 ...,请解释原因?

Mic*_*rry 7

线程正在异步执行 - 因此它们的输出将自然地交织在一起,这是可以预期的.在你的情况下:

1 1 2 2 1 1 3 3

...我"加粗"的位是一个线程的输出,我离开的位是另一个输出的(开始).我只能通过程序执行的方式解决这个问题 - 例如,如果你有两个线程只是打印字符"1",就不可能区分哪个线程正在打印什么字符.

请注意,数字出现的顺序和它们交织的方式完全是任意的 - 它可能很容易就像:

1 1 1 1 2 2 3 3 2 2 ..

......或任何其他可能的组合.不要依赖于您为任何特定程序获得的顺序,它完全未定义.

  • 这个.无法以更简单的方式解释它.+1 (2认同)

Joe*_*Joe 5

类的每个实例s1都有自己的变量,因此它们将相互独立地增加.如果你只创建了一个实例,那么输出就是1 1 2 2 3 3 ....

如果你每次打印两个线程1 1 2 2 3 3 ...,你会看到两个流混合在一起.只要它以正确的顺序输出每个数字的正确数字,它就会按照您的期望进行.你不能指望如何安排线程.

因此,您可能会看到1 1 2 2 3 3 1 1 2 2 3 3...1 1 1 1 2 2 2 2 3 3 3 3...或任何其他变体.

(1 1 1 1 2 2 2 2 3 3 3 3 ...有一天,如果调度程序以某种方式切片,你甚至可能会幸运地看到)

编辑:还在电话中阅读有关线程安全的答案println.