Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在这个java线程程序中得到这个输出?_Java_Multithreading - Fatal编程技术网

为什么我在这个java线程程序中得到这个输出?

为什么我在这个java线程程序中得到这个输出?,java,multithreading,Java,Multithreading,你好,我是java编程的初学者,最近我在学习线程,我在这个程序的输出中遇到了问题 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.ou

你好,我是java编程的初学者,最近我在学习线程,我在这个程序的输出中遇到了问题

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(); 
    } 
}
类s1实现可运行
{ 
int x=0,y=0;
int addX(){x++;返回x;}
int addY(){y++;返回y;}
public void run(){
对于(int i=0;i<10;i++){
System.out.println(addX()+“”+addY());
}
} 
公共静态void main(字符串参数[])
{ 
s1 run1=新的s1();
s1 run2=新的s1();
线程t1=新线程(run1);
螺纹t2=新螺纹(run2);
t1.start();
t2.start();
} 
}
我得到这样的输出


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

s1类的每个实例都有自己的变量,因此它们将彼此独立地递增。如果您只创建了一个实例,那么输出将是
1233…

如果每次打印两个线程
1 2 3 3…
,您将看到两个流混合在一起。只要它以正确的顺序输出每个数字的正确数字,它就是在做您期望的事情。您无法预期线程的调度方式

因此,您可能会看到
123123…
123133…
或任何其他变体

(如果调度程序以某种方式进行切片,有一天您甚至可能会幸运地看到
12313…


编辑:还要阅读
println
调用中的线程安全性。

线程是异步执行的,因此它们的输出将自然地交织在一起,这是意料之中的。就你而言:

121133

…我“加粗”的位是一个线程的输出,我留下的普通位是另一个线程的输出(开始)。我只能解决这个问题,因为程序是如何执行的——例如,如果有两个线程只打印字符“1”,就不可能区分哪个线程正在打印哪个字符

请注意,数字出现的顺序及其相互交织的方式完全是任意的——它也可能是类似于:

1111232


…或任何其他可能的组合。不要依赖任何特定程序的顺序,它完全没有定义。

尝试执行以下代码:

class Test extends Thread { 

    Test(String name) {
        super(name);
    }

    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() + ", name:"  + getName()); 
    }


    public static void main(String args[]) { 
        Test run1 = new Test("thread1"); 
        Test run2 = new Test("thread2"); 
        run1.start(); 
        run2.start(); 
    } 
}

这是因为踏板不会同步执行。你不知道什么时候会被处决。在您的代码中,11然后再次11只是两个线程执行相同操作的输出。

这看起来是一个合理的输出。你期待什么?因为。。阿恩克鲁斯?正如您正在使用线程一样…+1您认为如何?再次运行它您将获得另一个输出..现在加入()它们,看看会发生什么!这无法用更简单的方式解释它+谢谢你。如果它回答了你的问题,你应该勾选它。
1 1, name:thread2
2 2, name:thread2
1 1, name:thread1
2 2, name:thread1
3 3, name:thread2
3 3, name:thread1